我正在尝试解析MySQL docs。他们可以更清楚。他们似乎在说的是有五种可能性:SET NULL,NO ACTION,RESTRICT,CASCADE和SET DEFAULT。
NO ACTION和RESTRICT做同样的事情(防止任何DB更改破坏了FK)并且那个东西是默认的,所以如果省略ON DELETE子句你就说NO ACTION(或RESTRICT - 同样的事情)。
SET NULL允许删除父行,将FK设置为NULL。
CASCADE删除子行。
SET DEFAULT应该永远不会被使用。
这或多或少是正确的吗?
答案 0 :(得分:67)
是的,这是正确的:
无动作:[...] InnoDB 拒绝删除或更新操作 对于父表。
RESTRICT :拒绝删除或更新 父表的操作。 指定RESTRICT(或NO ACTION)是 与省略ON DELETE或 ON UPDATE子句。 [...]
显然NO ACTION
和RESTRICT
是同义词。此外,由于只要没有ON DELETE / UPDATE
子句就会使用它们,这是默认行为。
SET NULL :从父表中删除或更新行并设置 外键列中的一列或多列 子表为NULL。 [...]
外部列设置为NULL,前提是它未声明为NOT NULL(或InnoDB不允许删除或更新)。
CASCADE :从父表中删除或更新行 自动删除或更新 匹配子表中的行。 [...]
Cascade删除(或更新)外来列。
SET DEFAULT :识别此操作 解析器,但InnoDB拒绝 包含ON DELETE的表定义 SET DEFAULT或ON UPDATE SET DEFAULT 条款。
所以基本上你不能使用那个选项。