主鍵的存在就代表著表結構的完整性,表的記錄必須得有唯一區分的字段,主鍵主要是用於其他表的外來鍵關聯,本記錄的修改與刪除,當我們沒有主鍵時,這些操作會變的非常麻煩。1.主鍵約束: 乙個表只能有乙個主鍵約束。主鍵可以是單個字段,也可以是多個字段。無論是哪種情況,其所有欄位都是not null。我強調主鍵不應該具有實際的意義,這可能對於一些朋友來說不太認同,比如訂單表吧,會有「訂單編號」字段,而這個欄位呢在業務實際中本身就是應該具有唯一性,具有唯一標識記錄的功能,但我是不推薦採用訂單編號字段作為主鍵的,因為具有實際意義的字段,具有「意義更改」的可能性,比如訂單編號在剛開始的時候我們一切順利,後來客戶說「訂單可以作廢,並重新生成訂單,而且訂單號要保持原訂單號一致」,這樣原來的主鍵就面臨危險了。因此,具有唯一性的實際欄位也代表可以作為主鍵。因此,我推薦是新設乙個字段專門用為主鍵,此主鍵本身在業務邏輯上不體現,不具有實際意義。而這種主鍵在一定程式增加了複雜度,所以要視實際系統的規模大小而定,對於小專案,以後擴充套件不會很大的話,也查允許用實際唯一的字段作主鍵的。
2.unique約束:乙個表可以有多個unique約束,unique的字段可以為null。
3.主鍵與unique:不同點在於乙個表只能有乙個主鍵約束,但是可以有多個unique約束;主鍵所有欄位都是not null,unique可以是null。相同點在於都能保證唯一性。
4.主鍵、unique與索引:主鍵約束與unique約束缺省會成為索引。當主鍵和unique有多個欄位時,有索引字首性問題,即where語句中的條件必須有主鍵或者unique的第乙個字段,否則不會使用索引。
5. 外來鍵與主鍵、unique:外來鍵必須為另外一張表(父表)的主鍵或者唯一索引。如果要新增記錄,而父表中沒有則報錯。反之,如果要刪除父表中的記錄,而子表中有記錄,也會報錯。但是如果在建立外來鍵約束時,如果使用on delete cascade,則刪除父表中資料時,不報錯而直接把子表關聯的資料刪除。
如果要刪除父表,則需要加上cascade constraints,此時子表的foreign key被去除,表中記錄保持不變。
--標紅色的部分是外企的一道dba面試題。其實主鍵約束和unique約束的區別也可以出一道題。
樓上的幾位都解釋了主鍵的作用,我主要說下設和不設有啥區別:比如:張三的身份證號為123456
李四的身份證號為012345
設定身份證號為主鍵後,那麼資料庫就約束你身份證號不能重複,不能為空,那麼:
你向資料庫表插入王五的身份證號為123456,則提示你主鍵不能重複之類的錯誤;
也許你要問,那就是保證不重複嗎?主鍵可以保證不重複,並且不能為空,如果僅僅保證不重複的效果,可以只設定為索引就行了;
最後,主鍵可以是單字段主鍵,也可以2個或多個字段合併在一起形成聯合主鍵。
example:外來鍵必須是主鍵的所有列
create table test1( id1 number not null,
id2 number not null,
);create table test2
( id3 number not null,
id4 number not null,
constraint *** foreign key (id3) references test1 (id1) //wrong
constraint *** foreign key (id3,id4) references test1 (id1,id2));//right
主鍵和外來鍵
主鍵和外來鍵是把多個表組織為乙個有效的關聯式資料庫的粘合劑。主鍵和外來鍵的設計對物理資料庫的效能和可用性都有著決定性的影響。必須將資料庫模式從理論上的邏輯設計轉換為實際的物理設計。而主鍵和外來鍵的結構是這個設計過程的癥結所在。一旦將所設計的資料庫用於了生產環境,就很難對這些鍵進行修改,所以在開發階段...
主鍵和外來鍵
關係型資料庫中的某乙個屬性組能唯一標識一條記錄,該屬性組就可以成為乙個主鍵 主鍵只能有乙個,不能有重複的,不允許為空,用來保證資料完整性 外來鍵用於與另一張表的關聯。是能確定另一張表記錄的字段,用於保持資料的一致性。表的外來鍵是另一表的主鍵,外來鍵可以有重複的,可以是空值。用來和其他表建立聯絡用的 ...
主鍵和外來鍵
主鍵 primary key 一列 或一組列 其值能夠唯一區分表中每一行。唯一標識表中的每一行的這個列 或這組列 稱為主鍵。主鍵用來表示乙個特定的行,沒有主鍵,更新或者刪除表中的特定行很困難。應該總是定義的主鍵 雖然並不是總是都需要主鍵,但是大多數資料設計庫人員都應該保證他們建立的每乙個表中都有乙個...