MySQL 上删除级联。测试示例
问题:MySQL 上删除级联。测试示例 我想知道这个测试问题。我自己准备了示例并对其进行了测试,但我仍然不确定答案。 具有以下内容: CREATE TABLE foo ( id INT PRIMARY KEY AUTO_INCREMENT, name INT ) CREATE TABLE foo2 ( id INT PRIMARY KEY AUTO_INCREMENT, foo_id INT RE
问题:MySQL 上删除级联。测试示例
我想知道这个测试问题。我自己准备了示例并对其进行了测试,但我仍然不确定答案。
具有以下内容:
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
)
据我所知,答案是:
一个。创建了两个表
虽然也有:
** b。如果删除表 foo2 中 foo_id 为 2 的行,则表 foo 中 idu003d2 的行会被自动删除**
d.如果删除表 foo 中 id u003d 2 的行,则删除表 foo2 中所有 foo_id u003d 2 的行
在我的示例中,我将使用删除语法:
DELETE FROM foo WHERE id = 2;
DELETE FROM foo2 WHERE foo_id = 2;
出于某种原因,我无法找到表之间的任何关系,尽管看起来应该有一个。也许有一些 MySQL 设置,或者ON DELETE CASCADE
在表创建查询中没有正确使用?我很想知道...
解答
答案 d。是正确的,当且仅当存储引擎实际上支持并强制执行外键约束。
如果表是用Engine=MyISAM
创建的,那么 b.或 d。是正确的。
如果表是用Engine=InnoDB
创建的,那么 d. 是正确的。
笔记:
当且仅当FOREIGN_KEY_CHECKS = 1
;如果是FOREIGN_KEY_CHECKS = 0
,则父表 (foo) 中的DELETE
将_不_ 从子表 (foo2) 中删除引用从父表中删除的行的行。
使用SHOW VARIABLES LIKE 'foreign_key_checks'
(1u003dON, 0u003dOFF) 的输出验证这一点(正常默认设置为 ON。)
SHOW CREATE TABLE foo
的输出将显示该表使用的引擎。
SHOW VARIABLES LIKE 'storage_engine'
的输出将显示创建表且未指定引擎时使用的默认引擎。
更多推荐
所有评论(0)