Mysql
mysql中On Delete Cascade和On Update Cascade之間的區別
我在 MySQL 數據庫中有兩個表 -
parent
,child
. 我正在嘗試根據父表向我的子表添加外鍵引用。ON UPDATE CASCADE
和之間是否有任何顯著差異ON DELETE CASCADE
我的父表
CREATE TABLE parent ( id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB;
我的問題是:以下 sql 查詢有什麼區別。
ON DELETE CASCADE
CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ) ENGINE=INNODB;
ON UPDATE CASCADE
CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON UPDATE CASCADE ) ENGINE=INNODB;
ON UPDATE CASCADE ON DELETE CASCADE
CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON UPDATE CASCADE ON DELETE CASCADE ) ENGINE=INNODB;
查詢中是否有任何錯誤?這些查詢(1,2 和 3)是什麼意思?他們一樣嗎???
在這里和這裡都可以找到關於這個主題的一個非常好的執行緒。MySQL 的權威指南當然是文件,可在此處找到。
在 SQL 2003 標準中,有 5 種不同的引用操作:
- 級聯
- 嚴格
- 無動作
- 設置為空
- 預設設置
要回答這個問題:
- 級聯
ON DELETE CASCADE
意味著如果父記錄被刪除,任何子記錄也被刪除。在我看來,這不是一個好主意。您應該跟踪數據庫中曾經存在的所有數據,儘管這可以使用TRIGGER
s. (但是,請參閱下面評論中的警告)。ON UPDATE CASCADE
意味著如果父主鍵更改,子值也將更改以反映這一點。在我看來,這又不是一個好主意。如果你有PRIMARY KEY
規律地改變 s (甚至根本不改變!),那麼你的設計就有問題。再次,請參閱評論。ON UPDATE CASCADE ON DELETE CASCADE
意味著如果您UPDATE
ORDELETE
父母,則更改將級聯到孩子。這相當於AND
ing 前兩個語句的結果。
- 嚴格
RESTRICT
意味著任何刪除和/或更新父級的嘗試都將失敗並引發錯誤。這是在未明確指定引用操作的情況下的預設行為。> > 對於未指定的
ON DELETE
orON UPDATE
,預設操作始終是 RESTRICT`。 > > > 3. 無動作
NO ACTION
: 來自手冊。來自標準 SQL 的關鍵字。在 MySQL 中,相當於RESTRICT
. 如果引用的表中存在相關的外鍵值,MySQL Server 將拒絕對父表的刪除或更新操作。一些數據庫系統有延遲檢查,NO ACTION
是一種延遲檢查。在 MySQL 中,立即檢查外鍵約束,因此NO ACTION
與RESTRICT
.
- 設置為空
SET NULL
- 再次來自手冊。從父表中刪除或更新該行,並將子表中的一個或多個外鍵列設置為NULL
。恕我直言,這不是最好的想法,主要是因為沒有“時間旅行”的方式 - 即回顧子表並將記錄與NULL
s 與相關的父記錄相關聯 - 要麼CASCADE
使用TRIGGER
s 填充記錄表以跟踪更改(但是,請參閱評論)。
- 預設設置
SET DEFAULT
. SQL 標準的另一個(可能非常有用的)部分,MySQL 沒有費心實現!允許開發人員指定在 UPDATE 或 DELETE 上設置外鍵列的值。InnoDB 和 NDB 將拒絕帶有SET DEFAULT
子句的表定義。如上所述,您應該花一些時間查看文件,這裡。