mysql的各種外來鍵約束

2021-08-31 11:05:27 字數 1363 閱讀 4751

外來鍵約束對子表的含義:

如果在父表中找不到候選鍵,則不允許在子表上進行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中,與sql標準相違背的三點

1.       如果在父表中有多個key值相同,那麼在進行外來鍵check時,會當成有相同key值的其他行不存在; 比如當定義了乙個restrict行為外來鍵時,乙個子表行對應到多個父錶行(具有相同key值), innodb不允許刪除父表上的所有這些行

2.       父子表是同乙個表,自我參照時不允許指定on update cascade, on update set null

從mysql4.0.13開始,允許同乙個表上的on delete set null

從mysql4.0.21開始,允許同乙個表上的on delete cascade

但級聯層次不能超出15

3, innodb在檢查unique,constraint約束時,是row by row而不是語句或事務結束;

sql標準中對constraint的檢查是在語句執行完成時

注:在使用import 等工具匯入表資料時,碰到constraint時,可以用set foreign_key_checks = 0; 取消約束,具體見 手冊:

mysql約束與外來鍵 MySQL 外來鍵與約束

外來鍵的建立 建表如下 create table parent id int not null,primary key id type innodb create table child id int,parent id int,foreign key parent id references pa...

MySQL 外來鍵約束

建立測試主表.id 是主鍵.create table test main id int,value varchar 10 primary key id 建立測試子表.create table test sub id int,main id int,value varchar 10 primary k...

MySQL外來鍵約束

innodb型別表有乙個其他儲存引擎不支援的特性 外來鍵約束。當b表的外來鍵關聯到a表的主鍵時 表b是父表a表的子表 如果刪除了a表,那麼b中的外來鍵則仍然關聯著乙個不存在的表的主鍵。而外鍵約束則設定了當約束被破壞時應該應用的的規則,包括防止約束破壞。建立乙個外來鍵約束的語法是 foreign ke...