29

在更新和删除的外键选项中。每个字段 [Restrict, Cascade, Set Null, No Action] 有什么作用?

4

3 回答 3

44

如果你一个一个拿:

对于更新和删除:

如果您尝试更新/删除父行:

限制:如果有子行,则不会删除任何内容

级联:子行也将被删除/更新

Set Null:如果删除父列,子列将设置为 null

无操作:子行不会被删除/更新所关注

于 2013-04-23T07:25:57.883 回答
29

包含外键的表称为引用表或子表,包含候选键的表称为引用表或父表

Set NULL :当您删除父表行时,将列值设置为NULL 。

CASCADE : CASCADE 将在父项更改时传播更改。如果您删除一行,则约束表中引用该行的行也将被删除,等等。

RESTRICT :如果存在引用该父行的值的子行,则RESTRICT 会导致您无法删除给定的父行。

NO ACTION : NO ACTION 和 RESTRICT 非常相似。当对引用的表执行 UPDATE 或 DELETE 语句时,DBMS 在语句执行结束时验证没有违反任何引用关系。简而言之,子行不关心父行是否删除更新

于 2014-04-21T05:58:13.297 回答
1

当 UPDATE 或 DELETE 操作影响父表中具有匹配行的子表中的键值时,结果取决于使用 FOREIGN KEY 子句的 ON UPDATE 和 ON DELETE 子句指定的引用操作。MySQL 支持关于要采取的操作的五个选项,在此处列出:

CASCADE:删除或更新父表中的行,并自动删除或更新子表中匹配的行。支持 ON DELETE CASCADE 和 ON UPDATE CASCADE。在两个表之间,不要定义多个作用于父表或子表中的同一列的 ON UPDATE CASCADE 子句。

SET NULL:从父表中删除或更新行,并将子表中的外键列或列设置为NULL。支持 ON DELETE SET NULL 和 ON UPDATE SET NULL 子句。

如果您指定 SET NULL 操作,请确保您没有将子表中的列声明为 NOT NULL。

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

NO ACTION:来自标准 SQL 的关键字。在 MySQL 中,相当于 RESTRICT。如果引用的表中存在相关的外键值,MySQL Server 将拒绝对父表的删除或更新操作。一些数据库系统有延迟检查,NO ACTION 是延迟检查。在 MySQL 中,立即检查外键约束,因此 NO ACTION 与 RESTRICT 相同。

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

对于未指定的 ON DELETE 或 ON UPDATE,默认操作始终是 RESTRICT。

以上文字复制自: https ://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html

于 2019-03-27T06:30:27.210 回答