mysql cascade|restrict|no action|set null__mysql 外键的几种约束
mysql cascade|restrict|no action|set null
MySQL有兩種常用的引擎類型:MyISAM和InnoDB。目前只有InnoDB引擎類型支持外鍵約束。InnoDB中外鍵約束定義的語法如下:
[CONSTRAINT [symbol]] FOREIGN KEY[index_name] (index_col_name, ...)REFERENCES tbl_name (index_col_name,...)[ON DELETE reference_option][ON UPDATE reference_option]reference_option:RESTRICT | CASCADE | SET NULL | NO ACTION外鍵的使用需要滿足下列的條件:
如果子表試圖創建一個在父表中不存在的外鍵值,InnoDB會拒絕任何INSERT或UPDATE操作。如果父表試圖UPDATE或者DELETE任何子表中存在或匹配的外鍵值,最終動作取決于外鍵約束定義中的ON UPDATE和ON DELETE選項。InnoDB支持5種不同的動作,如果沒有指定ON DELETE或者ON UPDATE,默認的動作為RESTRICT:
外鍵約束使用最多的兩種情況無外乎:
1)父表更新時子表也更新,父表刪除時如果子表有匹配的項,刪除失敗;
2)父表更新時子表也更新,父表刪除時子表匹配的項也刪除。
前一種情況,在外鍵定義中,我們使用ON UPDATE CASCADE ON DELETE RESTRICT;后一種情況,可以使用ON UPDATE CASCADE ON DELETE CASCADE。
InnoDB允許你使用ALTER TABLE在一個已經存在的表上增加一個新的外鍵:
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, …) REFERENCES tbl_name (index_col_name,…) [ON DELETE reference_option] [ON UPDATE reference_option]InnoDB也支持使用ALTER TABLE來刪除外鍵:
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;MySql 外鍵約束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用
今天遇到數據庫的一個問題,就是每當從主表中刪除一個主鍵id時,由于與他相關聯的表中有相關的字段數據,所以無法刪除。查了一大堆資料,發現我建表關聯用的是on Restrict.可能問題就出在這里吧。
外鍵約束對子表的含義:
如果在父表中找不到候選鍵,則不允許在子表上進行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標準相違背的三點
如果在父表中有多個key值相同,那么在進行外鍵check時,會當成有相同key值的其他行不存在; 比如當定義了一個restrict行為外鍵時,一個子表行對應到多個父表行(具有相同key值), Innodb不允許刪除父表上的所有這些行
父子表是同一個表,自我參照時不允許指定on update cascade, on update set null
從mysql4.0.13開始,允許同一個表上的on delete set null
從mysql4.0.21開始,允許同一個表上的on delete cascade
但級聯層次不能超出15
Innodb在檢查unique,constraint約束時,是row by row而不是語句或事務結束;
SQL標準中對constraint的檢查是在語句執行完成時
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。
restrict方式 同no action, 都是立即檢查外鍵約束
--限制,指的是如果字表引用父表的某個字段的值,那么不允許直接刪除父表的該值;
cascade方式 在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄 On delete cascade從mysql3.23.50開始可用; on update cascade從mysql4.0.8開始可用
--級聯,刪除父表的某條記錄,子表中引用該值的記錄會自動被刪除;
No action方式 如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作 這個是ANSI SQL-92標準,從mysql4.0.8開始支持
--無參照完整性關系,有了也不生效。
set null方式 在父表上update/delete記錄時,將子表上匹配記錄的列設為null 要注意子表的外鍵列不能為not null On delete set null從mysql3.23.50開始可用; on update set null從mysql4.0.8開始可用
總結
以上是生活随笔為你收集整理的mysql cascade|restrict|no action|set null__mysql 外键的几种约束的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL操作之JSON数据类型操作详解
- 下一篇: MySQL 字段默认值该如何设置