MySQL的默认ON DELETE行为是什么?


71

我正在尝试解析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应该永远不被使用。

这或多或少是正确的吗?


您错过了CASCADE选项
抖动

2
而且您正确理解。未在MYSQL中的FK约束上指定引用选项与说ON DELETE RESTRICT
抖动

4
只有在mysql中,NO ACTION和RESTRICT才是同一件事。在另一个我认为不正确的数据库中,因为如果在操作结束时未违反FK约束,则从理论上讲,NO ACTION允许删除/更改引用的父对象
抖动2009年

Answers:


94

是的,这是正确的:

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

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

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

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

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

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

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

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

因此,基本上您不能使用该选项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.