【问题标题】:What is MySQL's default ON DELETE behavior?MySQL 的默认 ON DELETE 行为是什么?
【发布时间】:2010-11-04 21:17:33
【问题描述】:

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

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

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

CASCADE 删除子行。

SET DEFAULT 永远不应该被使用。

这或多或少是正确的吗?

【问题讨论】:

  • 您错过了 CASCADE 选项
  • 你理解正确。在 MYSQL 的 FK 约束上不指定引用选项与说 ON DELETE RESTRICT 是一样的
  • 只有在 mysql 中,NO ACTION 和 RESTRICT 才具有相同的含义。在另一个我不成立的数据库中,如果在操作结束时没有违反 FK 约束,理论上 NO ACTION 允许删除/更改引用的父级

标签: mysql innodb


【解决方案1】:

是的,没错:

无操作:[...] InnoDB 拒绝删除或更新操作 用于父表。

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

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

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

外部列设置为 NULL,前提是它未声明为 NOT NULL(或 InnoDB 不允许删除或更新)。

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

级联删除(或更新)外部列。

SET DEFAULT:此操作被识别 由解析器,但 InnoDB 拒绝 包含 ON DELETE 的表定义 设置默认值或更新设置默认值 条款。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2011-10-09
    • 2020-10-27
    相关资源
    最近更新 更多