我想知道这个测试问题.我自己准备了这个例子并进行了测试,但我仍然不确定答案.
具有以下内容:
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或其他支持它的存储引擎.