MySQL的删除级联。测试示例

MySQL的删除级联。测试示例,mysql,cascade,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 ) 据我所知,答案是: a。创建了两个表 虽然也有: b。

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

以下是:

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
)
据我所知,答案是:

a。创建了两个表

虽然也有:

b。如果删除表foo2中foo_id为2的行,则会自动删除表foo中id=2的行

d.如果删除表foo中id=2的行,则删除表foo2中id=2的所有行

在我的示例中,我会使用delete语法:

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

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

两个表之间确实存在关系,它在foo2创建命令中:
。。。foo_id int在删除级联上引用foo(id)

根据报告:

级联:删除或更新父表中的行,自动删除或更新子表中匹配的行。同时支持删除级联和更新级联

此外,根据该报告:

对于InnoDB以外的存储引擎,在定义列时可以使用REFERENCES-tbl_-name(col_-name)子句,该子句没有实际效果,仅作为备注或注释,告知您当前定义的列将引用另一个表中的列


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

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

如果表是用
引擎=MyISAM
创建的,那么b。或者d。这是正确的

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

注:

这对于InnoDB是正确的,当且仅当
外键检查=1
;如果
FOREIGN\u KEY\u CHECKS=0
,则从父表(foo)中删除
DELETE
不会从子表(foo2)中删除引用从父表中删除的行的行

显示变量如“外键检查”的输出验证这一点(1=ON,0=OFF)
(正常默认情况下,此选项处于启用状态。)

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


SHOW变量(如'storage\u engine')
的输出将显示创建表时使用的默认引擎,但未指定引擎。

它将是d。(不是b.)那是正确的。外键从子表到父表。从子表中删除行(通过外键)对父表没有影响。当从父表中删除一行时,外键起作用。
MyISAM
InnoDB
之间的显著区别在于b的正确性