Mysql

mysql中On Delete Cascade和On Update Cascade之間的區別

  • November 22, 2017

我在 MySQL 數據庫中有兩個表 - parent, child. 我正在嘗試根據父表向我的子表添加外鍵引用。ON UPDATE CASCADE和之間是否有任何顯著差異ON DELETE CASCADE

我的父表

CREATE TABLE parent (
   id INT NOT NULL,
   PRIMARY KEY (id)
) ENGINE=INNODB;

我的問題是:以下 sql 查詢有什麼區別。

  1. 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;
  1. 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;
  1. 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 種不同的引用操作:

  1. 級聯
  2. 嚴格
  3. 無動作
  4. 設置為空
  5. 預設設置

要回答這個問題:

  1. 級聯
  • ON DELETE CASCADE意味著如果父記錄被刪除,任何子記錄也被刪除。在我看來,這不是一個好主意。您應該跟踪數據庫中曾經存在的所有數據,儘管這可以使用TRIGGERs. (但是,請參閱下面評論中的警告)。
  • ON UPDATE CASCADE意味著如果父主鍵更改,子值也將更改以反映這一點。在我看來,這又不是一個好主意。如果你有PRIMARY KEY規律地改變 s (甚至根本不改變!),那麼你的設計就有問題。再次,請參閱評論。
  • ON UPDATE CASCADE ON DELETE CASCADE意味著如果您UPDATE OR DELETE父母,則更改將級聯到孩子。這相當於ANDing 前兩個語句的結果。
  1. 嚴格
  • RESTRICT意味著任何刪除和/或更新父級的嘗試都將失敗並引發錯誤。這是在未明確指定引用操作的情況下的預設行為。

> > 對於未指定的ON DELETEor ON UPDATE,預設操作始終是 RESTRICT`。 > > > 3. 無動作

  • NO ACTION: 來自手冊。來自標準 SQL 的關鍵字。在 MySQL 中,相當於RESTRICT. 如果引用的表中存在相關的外鍵值,MySQL Server 將拒絕對父表的刪除或更新操作。一些數據庫系統有延遲檢查,NO ACTION是一種延遲檢查。在 MySQL 中,立即檢查外鍵約束,因此NO ACTIONRESTRICT.
  1. 設置為空
  • SET NULL- 再次來自手冊。從父表中刪除或更新該行,並將子表中的一個或多個外鍵列設置為NULL。恕我直言,這不是最好的想法,主要是因為沒有“時間旅行”的方式 - 即回顧子表並將記錄與NULLs 與相關的父記錄相關聯 - 要麼CASCADE使用TRIGGERs 填充記錄表以跟踪更改(但是,請參閱評論)。
  1. 預設設置
  • SET DEFAULT. SQL 標準的另一個(可能非常有用的)部分,MySQL 沒有費心實現!允許開發人員指定在 UPDATE 或 DELETE 上設置外鍵列的值。InnoDB 和 NDB 將拒絕帶有SET DEFAULT子句的表定義。

如上所述,您應該花一些時間查看文件,這裡

引用自:https://dba.stackexchange.com/questions/74627