mysql外來鍵約束

2021-10-19 07:49:53 字數 2276 閱讀 9644

cascade

在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄

set null

在父表上update/delete記錄時,將子表上匹配記錄的列設為null (要注意子表的外來鍵列不能為not null)

no action

如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作

restrict

同no action, 都是立即檢查外來鍵約束

set null

父表有變更時,子表將外來鍵列設定成乙個預設的值 但innodb不能識別

null、restrict、no action

刪除:從表記錄不存在時,主表才可以刪除。刪除從表,主表不變

更新:從表記錄不存在時,主表才可以更新。更新從表,主表不變

cascade

刪除:刪除主表時自動刪除從表。刪除從表,主表不變

更新:更新主表時自動更新從表。更新從表,主表不變

set null

刪除:刪除主表時自動更新從表值為null。刪除從表,主表不變

更新:更新主表時自動更新從表值為null。更新從表,主表不變

外來鍵約束屬性: restrict | cascade | set null | no action 外來鍵的使用需要滿足下列的條件:

兩張表必須都是innodb表,並且它們沒有臨時表。

建立外來鍵關係的對應列必須具有相似的innodb內部資料型別。

建立外來鍵關係的對應列必須建立了索引。

假如顯式的給出了constraint symbol,那symbol在資料庫中必須是唯一的。假如沒有顯式的給出,innodb會自動的建立。

如果子表試圖建立乙個在父表中不存在的外鍵值,innodb會拒絕任何insert或update操作。如果父表試圖update或者delete任何子 表中存在或匹配的外鍵值,最終動作取決於外來鍵約束定義中的on update和on delete選項。innodb支援5種不同的動作,如果沒有指定on delete或者on update,預設的動作為restrict:

cascade: 從父表中刪除或更新對應的行,同時自動的刪除或更新自表中匹配的行。on delete canscade和on update canscade都被innodb所支援。

set null: 從父表中刪除或更新對應的行,同時將子表中的外來鍵列設為空。注意,這些在外鍵列沒有被設為not null時才有效。on delete set null和on update set set null都被innodb所支援。

no action: innodb拒絕刪除或者更新父表。

restrict: 拒絕刪除或者更新父表。指定restrict(或者no action)和忽略on delete或者on update選項的效果是一樣的。

set default: innodb目前不支援。

外來鍵約束使用最多的兩種情況無外乎:

1)父表更新時子表也更新,父表刪除時如果子表有匹配的項,刪除失敗;

2)父表更新時子表也更新,父表刪除時子表匹配的項也刪除。

前一種情況,在外鍵定義中,我們使用on update cascade on delete restrict;後一種情況,可以使用on update cascade on delete cascade。

當執行外來鍵檢查之時,innodb對它照看著的子或父記錄設定共享的行級鎖。innodb立即檢查外來鍵約束,檢查不對事務提交延遲。

要使得對有外來鍵關係的表重新載入轉儲檔案變得更容易,mysqldump自動在轉儲輸出中包括乙個語句設定foreign_key_checks為0。這避免在轉儲被重新裝載之時,與不得不被以特別順序重新裝載的表相關的問題。也可以手動設定這個變數:

mysql> set foreign_key_checks = 0;

mysql> source dump_file_name;

mysql> set foreign_key_checks = 1;

如果轉儲檔案包含對外鍵是不正確順序的表,這就以任何順序匯入該錶。這樣也加快匯入操作。設定foreign_key_checks為0,對於在load data和alter table操作中忽略外來鍵限制也是非常有用的。

innodb不允許你刪除乙個被foreign key表約束引用的表,除非你做設定set foreign_key_checks=0。當你移除乙個表的時候,在它的建立語句裡定義的約束也被移除。

如果你重新建立乙個被移除的表,它必須有乙個遵從於也引用它的外來鍵約束的定義。它必須有正確的列名和型別,並且如前所述,它必須對被引用的鍵有索引。如果這些不被滿足,mysql返回錯誤號1005 並在錯誤資訊字串中指向errno 150。

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...