80

我正在尝试解析 MySQL文档。他们可以更清楚。他们似乎在说有五种可能性:SET NULL、NO ACTION、RESTRICT、CASCADE 和 SET DEFAULT。

NO ACTION 和 RESTRICT 做同样的事情(防止任何破坏 FK 的数据库更改)并且该事情是默认设置,因此如果您省略 ON DELETE 子句,您就是在说 NO ACTION(或 RESTRICT - 同样的事情)。

SET NULL 允许删除父行,将 FK 设置为 NULL。

CASCADE 删除子行。

SET DEFAULT 永远不应该被使用。

这或多或少是正确的?

4

1 回答 1

105

是的,这是正确的:

NO ACTION : [...] InnoDB 拒绝父表的删除或更新操作。

RESTRICT:拒绝对父表的删除或更新操作。指定 RESTRICT(或 NO ACTION)与省略 ON DELETE 或 ON UPDATE 子句相同。[...]

显然NO ACTIONRESTRICT是同义词。此外,由于在没有ON DELETE / UPDATE子句的情况下使用它们,因此这是默认行为。

SET NULL:删除或更新父表中的行,并将子表中的外键列或列设置为 NULL。[...]

如果未将外部列声明为 NOT NULL(或 InnoDB 将不允许删除或更新),则将外部列设置为 NULL。

CASCADE:删除或更新父表中的行,并自动删除或更新子表中匹配的行。[...]

Cascade 删除(或更新)外部列。

SET DEFAULT:解析器识别此操作,但 InnoDB 拒绝包含 ON DELETE SET DEFAULT 或 ON UPDATE SET DEFAULT 子句的表定义。

所以基本上你不能使用那个选项。

于 2009-09-30T13:11:40.347 回答