MySQL上的删除级联.测试例

Eae*_*Eae 24 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
)
Run Code Online (Sandbox Code Playgroud)

据我所知,答案是:

一个.创建了两个表

虽然也有:

湾 如果删除表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;
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我无法找到表格之间的任何关系,尽管看起来应该有一个.也许有一些MySQL设置或者可能ON DELETE CASCADE在表创建查询中没有正确使用?我不知道......

spe*_*593 37

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

如果使用创建表Engine=MyISAM,则b.或d.是正确的.

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

注意:

对InnoDB来说,这是正确的,当且仅当FOREIGN_KEY_CHECKS = 1; if FOREIGN_KEY_CHECKS = 0,那么DELETE来自父表(foo)的a将不会从子表(foo2)中删除引用从父表中删除的行的行.

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

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

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


Vic*_*Vic 14

你确实有两个表之间的关系,它在foo2创建命令中: ... foo_id int references foo(id) on delete cascade.

根据MySQL外键约束参考:

CASCADE:从父表中删除或更新行,并自动删除或更新子表中的匹配行.支持ON DELETE CASCADE和ON UPDATE CASCADE.

另外,根据MySQL外键参考:

对于除InnoDB之外的存储引擎,可以在定义列时使用REFERENCES tbl_name(col_name)子句,该子句没有实际效果,并且仅作为备忘录或注释,表示您当前定义的列是预期的引用另一个表中的列.

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