MySQL上的删除级联。测试例

时间:2012-08-29 20:15:36

标签: mysql cascade

我想知道这个测试问题。我自己准备了这个例子并进行了测试,但我仍然不确定答案。

以下内容:

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
)

据我所知,答案是:

一个。创建了两个表

虽然也有:

湾如果表foo2中的一行(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在表创建查询中没有正确使用?我不知道......

2 个答案:

答案 0 :(得分:37)

回答d。当且仅当存储引擎实际支持并强制执行外键约束时才是正确的。

如果表格是使用Engine=MyISAM创建的,那么b。或d。是对的。

如果使用Engine=InnoDB创建表格,则 d。是正确的。

注:

当且仅当FOREIGN_KEY_CHECKS = 1时,InnoDB才会如此;如果FOREIGN_KEY_CHECKS = 0,则父表(foo)中的DELETE从子表(foo2)中删除引用从父表中删除的行的行。< / p>

使用SHOW VARIABLES LIKE 'foreign_key_checks'的输出验证这一点(1 = ON,0 = OFF) (正常默认值为ON。)

SHOW CREATE TABLE foo的输出将显示该表使用的引擎。

SHOW VARIABLES LIKE 'storage_engine'的输出将显示创建表时未使用引擎时使用的默认引擎。

答案 1 :(得分: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以外的存储引擎,可以在定义列时使用REFERENCES tbl_name(col_name)子句,该子句没有实际效果,并且只作为备忘录或注释给你那个列您当前定义的目的是引用另一个表中的列

因此,由于外键是从子表到父表,它使foo成为父表,foo2成为子表,因此从foo删除行将级联删除foo2,提供您使用InnoDB或其他支持它的存储引擎。