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的正确性