问题: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'的输出将显示创建表且未指定引擎时使用的默认引擎。

Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐