談談惟一約束和惟一索引

 

 

約束 全稱完整性約束,它是關係數據庫中的對象,用來存放插入到一個表中一列數據的規則,用來確保數據的準確性和一致性。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;
相關文章
相關標籤/搜索