2012-08-29 116 views
24

我在想這個測試問題。我自己準備了這個例子並進行了測試,但我仍然不確定答案。MySQL刪除級聯。測試示例

下列要求:

CREATE TABLE foo (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    name INT 
) 

CREATE TABLE foo2 (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    foo_id INT REFERENCES foo(id) ON DELETE CASCADE 
) 

據我所看到的答案是:

一個。兩個表創建

雖然也有:

灣如果刪除表foo中的foo_id爲2的行,則表foo中id = 2的行被自動刪除

d。如果表foo中id = 2的行被刪除,在表foo2的與foo_id = 2的所有行被刪除

在我的例子,我會使用刪除語法:

DELETE FROM foo WHERE id = 2; 
DELETE FROM foo2 WHERE foo_id = 2; 

出於某種原因,我無法找到表之間的任何關係,雖然它似乎就像應該有一個。也許有一些MySQL設置,或者ON DELETE CASCADE在表創建查詢中沒有正確使用?我想知道...

回答

37

答案d。是否正確,當且僅當存儲引擎實際支持並執行外鍵約束。

如果表格是用Engine=MyISAM創建的,那麼既不b。或者d。是正確的。

如果使用Engine=InnoDB創建表格,則d。是正確的。

注:

這是InnoDB的真,當且僅當FOREIGN_KEY_CHECKS = 1;如果FOREIGN_KEY_CHECKS = 0,則來自父表(foo)的DELETE而不是從引用從父表中移除的行的子表(foo2)中刪除行。

與輸出從SHOW VARIABLES LIKE 'foreign_key_checks'(1 = ON,0 = OFF)驗證此 (正常默認爲這是ON。)

SHOW CREATE TABLE foo輸出將顯示該發動機表使用。

SHOW VARIABLES LIKE 'storage_engine'的輸出將顯示創建表時未使用引擎時使用的默認引擎。

+0

** MyISAM'和'InnoDB'之間** ** **正確性的顯着區別 – JalalJaberi

+0

你是對的。這是** d **。對不起。 – JalalJaberi

14

你確實有兩個表之間的關係,它在foo2創建命令中: ... foo_id int references foo(id) on delete cascade

按照MySQL Foreign Key Constraints reference

CASCADE:刪除或更新從父表中的行,並自動刪除或更新子表中匹配的行。支持ON DELETE CASCADE和ON UPDATE CASCADE。

此外,根據MySQL Foreign Keys reference

對於除InnoDB的其它存儲引擎,它限定一列使用一個參考tbl_name(COL_NAME)子句,不具有實際的效果,時能夠並且僅作爲備忘錄或評論意見給您,您當前定義的列旨在引用另一個表中的列。

如此以來,外鍵從子表的父表,它使foo父表和foo2子表,所以從foo刪除一行將級聯刪除到foo2,爲您提供使用InnoDB或一些支持它的其他存儲引擎。

+1

這將是d。 (而不是b),那將是正確的。外鍵是從子表格到父表格。從子表中刪除一行對父表沒有影響(通過外鍵)。這是從父表中刪除一行的外鍵進入遊戲。 – spencer7593

+1

@ spencer7593 - 你說得對,我會編輯它,謝謝 – Vic