Primary、Unique、Index各代表什麼意義?

在資料表的欄位設定中,你可以設定~ Primary Key = 主鍵、Unique Key = 不重覆鍵、Index Key = 索引鍵,這三個代表的意義是什麼呢?

當你設定一個欄位為Primary Key,也代表這個欄位是not null,並且unique。
如果Primary Key為多欄位組合,例如(id1+id2),這個(id1+id2)也必須是not null & unique。

Primary Key

如下圖,原本可以null的欄位設定成Primary Key 之後,就變成no null,並且Key變成PRI。


其index結構如下圖:



但是如果我們把Primary Key取消,如下圖,PRI不見了,但是仍然是no null。


取消Primary Key之後的index變怎樣呢? 如下圖,index變空的。


要恢復原本的允許null,就必須再下指令,如下圖:


Unique Key

當你設定一個欄位為Unique,代表這個欄位不能重覆,但是可以null,如下圖:


index變怎樣呢? 如下圖,又有了index結構,表示設成unique,跟設索引是一樣的。


如果我們把Unique取消,如下圖,UNI就不見了。


把Unique取消之後,其index結構也不見了,如下圖:



Index Key

當你設定一個欄位為Index,如下圖,顯示成為MUL。


設了index之後,其index結構如下圖:


如果我們把Index取消,如下圖,MUL就不見了,當然index結構也就不見了。


結論

Primary Key比較沒有爭議,它一定是非null且unique,並且一個table只能有一個Primary Key。

當你想要建立兩個Primary Key,就會出現錯誤,如下圖:



Unique允許null這件事,其實有點奇怪,既然是unique(不能重覆),當然不能兩個null同時存在,因此雖然unique允許null,但是其實也可以把unique的欄位設成not null,比較不會看得很彆扭。

而UNI跟MUL有何差別呢? 當我們設定unique與index後,都還是可以允許null,但是一個變成UNI,一個變成MUL。你還可以設兩個欄位都是UNI,或是兩個欄位都是MUL。

UNI跟MUL的唯一差別就是,前者不能重覆,後者允許重覆。

例如人事資料表中的姓名,你可以設成index,但是不能設成unique,因為不同資料列可能相同姓名。


相關參考資料:
http://dreamlandit.wordpress.com/2013/02/20/creating-a-mysql-index/
http://miggo.pixnet.net/blog/post/30862194-%5Bmysql%E5%9F%BA%E6%9C%AC%E8%A7%80%E5%BF%B5%5D-primary-key---index---unique%E5%B7%AE%E5%88%A5
http://dev.mysql.com/doc/refman/5.0/en/show-index.html
http://dev.mysql.com/doc/refman/5.0/en/drop-index.html
http://www.it-iss.com/mysql/mysql-remove-not-null-constraint-from-a-table/
http://dev.mysql.com/doc/refman/5.0/en/show-columns.html

[補充]

先建立三個表單,各設定PK(primary key)、UK(unique key)、IK(index key)

Table pkdemo如下,其PK為fld1 ~


Table ukdemo如下,其UK為fld1 ~


Table ikdemo如下,其INDEX為fld1 ~


可以看到

PRIMARY KEY會標示 PRI,該欄位必須NOT NULL且Unique(唯一)。
UNIQUE KEY會標示UNI,該欄位必須Unique(唯一),但是可以NULL,而且可以多個 NULL。
INDEX KEY會標示MUL,該欄位不必Unique(唯一),也可以NULL。
一個表單只能存在一個PRIMARY KEY,但是UNIQUE KEY與INDEX KEY可以多個。

PRIMARY KEY

當我們移除PRIMARY KEY後,就沒有index了,但是fld1還是NOT NULL


當我們再加回PRIMARY KEY後,就跟原本一模一樣了。



UNIQUE KEY

當我們移除ukdemo的unique KEY後,就沒有index了,但是fld1還是可以NULL


當我們再加回unique KEY後,就跟原本一模一樣了。



INDEX KEY

當我們移除index KEY後,就沒有index了



當我們再加回index KEY後,就跟原本一模一樣了。



張貼留言

0 留言