1. 程式人生 > >unique key、primary key、foreign key、index、key的區別理解

unique key、primary key、foreign key、index、key的區別理解

首先說一下SQL中約束的概念:

SQL 約束用於規定表中的資料規則。如果存在違反約束的資料行為,行為會被約束終止。約束可以在建立表時規定(通過 CREATE TABLE 語句),或者在表建立之後規定(通過 ALTER TABLE 語句)。舉個栗子:

CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);

可以看到,建立一個欄位,首先是欄位名,然後是欄位資料型別,後面的就是對此欄位的約束,一般有not null ,unsigned,auto_increment,default 等等。

然後挨個解釋題目中的五個概念

  • unique key:在一張表中可以標識一個列或多個列,因此它既可以看做列級約束、也可以看做表級約束。 用來限制一個列中所有元素都不重複,列元素可以為null。
  • primary key:在一張表中只能有一個,來約束該列中所有元素不重複,且不能為null。
  • 以上兩者聯絡與區別:primary = unique + not null 是一個可取的說法;primary是一個索引,當系統要查詢表中某條記錄時,可以通過primary key標記的列,快速查詢到所需的記錄,所以這裡primary修飾的列一般都是事先規定好,就是用來進行索引的列,比如:id int unsigned not null auto_increment; 這種列。 而unique key 只是用來限制列元素不重複,並不一定用來快速檢索,比如:我們想保證一個表中“身份證”欄位的每一條記錄不重複  or   “電話號”欄位每一條記錄不重複,就可以用unique進行約束,而此時這樣的列跟索引查詢並沒有關係。
  • foreign key:一個表中的 foreign key 指向另一個表中的 unique key (當然也可以是primary key,而且一般就應該是primary key吧,畢竟primary key沒null的值)。就是一張表中,foreign標識的列,其中每一個元素,都能對應到另一張表中unique標識的列元素。
  • index / key :兩者一般可以劃等號,同等看待。其功能:如果要像primary key標識的欄位一樣,能夠利用索引快速的查詢得到結果怎麼辦?primary key一張表只能設定一個,此時就可以用index / key 來給一個欄位列加索引,從而大大加快該列中元素的查詢速度。