本文我們主要介紹一些MySQL數據庫的外鍵約束的知識,接下來就讓我們一起來了解一下吧。
外鍵約束須滿足以下條件:
父子表都為innodb,不是臨時表。
在子表上,必須存在一個索引,外鍵列是索引列的全部或部分,但必須是開頭部分,並且順序一致; 從mysql4.1.2開始,如果不存在索引,會自動創建外鍵上的索引; 加速約束檢查/避免全表掃描。
在父表上,必須存在一個索引,被參照鍵是索引列的全部或部分,但必須是開頭部分,並且順序一致; 加速約束檢查/避免全表掃描。
不允許在外鍵前綴或後綴上索引; 外鍵不能包括text/blob列。
如果指定約束標識符symbol, 那麼必須數據庫范圍唯一; 不指定時,系統會自動產生。
父子表的相應列必須有相似的內部數據類型, 以便進行比較時不必進和類型轉換。
對於數字類型,類型長度與符號必須相同。
對於字符類型, 長度不必相同。
如果創建一個on delete set null或on update set null約束,子表的列必須不能為not null。
從mysql3.23.50開始,如果外鍵或候選鍵(被引用鍵)列上有null值,mysql 將不進行check。
外鍵約束對子表的含義:
如果在父表中找不到候選鍵,則不允許在子表上進行insert/update。
外鍵約束對父表的含義:
在父表上進行update/delete以更新或刪除在子表中有一條或多條對應匹配行的候選鍵時,父表的行為取決於:在定義子表的外鍵時指定的on update/on delete子句, InnoDB支持5種方式, 分列如下:
cascade方式
在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄;
On delete cascade從mysql3.23.50開始可用; on update cascade從mysql4.0.8開始可用。
set null方式
在父表上update/delete記錄時,將子表上匹配記錄的列設為null;
要注意子表的外鍵列不能為not null;
On delete set null從mysql3.23.50開始可用; on update set null從mysql4.0.8開始可用。
No action方式
如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作;
這個是ANSI SQL-92標准,從mysql4.0.8開始支持。
Restrict方式
同no action, 都是立即檢查外鍵約束;
Set default方式
解析器認識這個action,但Innodb不能識別。
注意:trigger不會受外鍵cascade行為的影,,即不會解發trigger。
關於MySQL數據庫外鍵約束的知識就介紹到這裡了,希望本次的介紹能夠給您帶來一些收獲,謝謝!