谈谈惟一约束和惟一索引

 

 

约束 全称完整性约束,它是关系数据库中的对象,用来存放插入到一个表中一列数据的规则,用来确保数据的准确性和一致性。mysql

索引 数据库中用的最频繁的操做是数据查询,索引就是为了加速表中数据行的检索而建立的一种分散的数据结构。能够把索引类比成书的目录,有目录的确定比没有目录的书,更方便查找。sql

惟一约束 保证在一个字段或者一组字段里的数据都与表中其它行的对应数据不一样。和主键约束不一样,惟一约束容许为 NULL,只是只能有一行数据库

惟一索引 不容许具备索引值相同的行,从而禁止重复的索引或键值。数据结构

惟一约束和惟一索引 都是为了保证表中被限制的字段不容许有重复的值,看起来功能是同样的,那为何要设计这样两种同样的功能呢?

性能

 

 

首先建立两个字段值同样的表 t1,t2,并为 t1 表中的 col1 列设置惟一约束。spa

 

CREATE TABLE t1 (
    col1 INT(11), 
    col2 VARCHAR(20), 
 CONSTRAINT t1_uq UNIQUE (col1)
);

CREATE TABLE t2 (
    col1 INT(11), 
    col2 VARCHAR(20)
);
 

 

而后为表 t2 表中的 col1 列设置惟一索引设计

 
CREATE UNIQUE INDEX 
    t2_idx ON t2 (col1);

  

建立表 t3,并将 t1 表中的 col1 列设置为 t3 表中 col2 列的外键code

 
CREATE TABLE t3 (
    col1 INT(11), 
    col2 INT(11), 
    col3 VARCHAR(20), 
    CONSTRAINT t3_fk FOREIGN KEY (col2) REFERENCES t1 (col1)
);
 

 

 

到此为止,基本上就能得出,惟一约束和惟一索引在 MySQL 数据库里区别了对象

  1. 概念上不一样,约束是为了保证数据的完整性,索引是为了辅助查询;
  2. 建立惟一约束时,会自动的建立惟一索引;
  3. 在理论上,不同,在实际使用时,基本没有区别。

关于第二条,MySQL 中惟一约束是经过惟一索引实现的,为了保证没有重复值,在插入新记录时会再检索一遍,怎样检索快,固然是建索引了,因此,在建立惟一约束的时候就建立了惟一索引。 blog

 

 

4.惟一性索引

若是肯定某个数据列只包含彼此各不相同的值,在为这个数据列建立索引的时候,就应该用关键字UNIQUE把它定义为一个惟一索引,Mysql会在有新纪录插入数据表时,自动检查新纪录的这个字段的值是否已经在某个记录的这个字段里出现过了。若是是,mysql将拒绝插入那条新纪录。也就是说,惟一索引能够保证数据记录的惟一性。事实上,在许多场合,人们建立惟一索引的目的每每不是为了提升访问速度,而只是为了不数据出现重复

5.索引的优势

5.1.能够经过创建惟一索引或者主键索引,保证数据库表中每一行数据的惟一性

5.2.创建索引能够大大提升检索的数据,以及减小表的检索行数

5.3.在表链接的链接条件,能够加速表与表直接的相连

5.4.在分组和排序字句进行数据检索,能够减小查询时间中分组和排序时所消耗的时间(数据库的记录会从新排序)

5.5.创建索引,在查询中使用索引,能够提升性能。



 
CREATE TABLE parent(
 2 
 3                     id INT NOT NULL,
 4 
 5                     PRIMARY KEY (id)
 6 
 7 ) TYPE=INNODB;
 8 
 9  CREATE TABLE child(
10 
11                    id INT, parent_id INT,
12 
13                    INDEX par_ind (parent_id),
14 
15                    FOREIGN KEY (parent_id) REFERENCES parent(id)
16 
17                    ON DELETE CASCADE
18 
19 ) TYPE=INNODB;

      以下是一个更复杂的例子,其中一个product_order表对其它两个表有外键。一个外键引用一个product表中的双列索引。另外一个引用在customer表中的单行索引:

 1 CREATE TABLE product (
2
3 category INT NOT NULL,
4
5 id INT NOT NULL,
6
7 price DECIMAL,
8
9 PRIMARY KEY(category, id)
10
11 ) TYPE=INNODB;
12
13  CREATE TABLE customer (id INT NOT NULL,
14
15 PRIMARY KEY (id)
16
17 ) TYPE=INNODB;
18
 
 

19  CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
20
21 product_category INT NOT NULL,
22
23 product_id INT NOT NULL,
24
25 customer_id INT NOT NULL,
26
27 PRIMARY KEY(no),
28
29 INDEX (product_category, product_id),
30
31 FOREIGN KEY (product_category, product_id)
32
33 REFERENCES product(category, id)
34
35 ON UPDATE CASCADE ON DELETE RESTRICT,
36
37 INDEX (customer_id),
38
39 FOREIGN KEY (customer_id)
40
41 REFERENCES customer(id) 42 43 ) TYPE=INNODB;
相关文章
相关标签/搜索