【发布时间】:2013-04-16 07:27:23
【问题描述】:
在更新和删除的外键选项中。 每个字段[Restrict, Cascade, Set Null, No Action] 的作用是什么?
【问题讨论】:
-
如果一切都失败了,请阅读手册:dev.mysql.com/doc/refman/5.5/en/…
标签: mysql-workbench
在更新和删除的外键选项中。 每个字段[Restrict, Cascade, Set Null, No Action] 的作用是什么?
【问题讨论】:
标签: mysql-workbench
如果你一个一个拿:
对于更新和删除:
如果您尝试更新/删除父行:
限制:如果有子行,则不会删除任何内容
级联:子行也将被删除/更新
Set Null : 如果删除父列,子列将设置为 null
无操作:子行不会被删除/更新所关注
【讨论】:
包含外键的表称为引用或子表,包含候选键的表称为引用或父表。
Set NULL:删除父表行时,将列值设置为NULL。
CASCADE :当父级更改时,CASCADE 将传播更改。如果您删除一行,受限表中引用该行的行也将被删除,等等。
RESTRICT:如果存在引用父行值的子行,RESTRICT 会导致您无法删除给定的父行。
NO ACTION:NO ACTION 和 RESTRICT 非常相似。当对引用的表执行 UPDATE 或 DELETE 语句时,DBMS 会在语句执行结束时验证没有任何引用关系违反。简而言之,子行不关心父行是否删除或更新。
【讨论】:
in short child row no concern if parent row delete or update,这是否意味着在NO ACTION中,如果删除父级,这是不允许的吗?在父更新的情况下,子是否保持不变?
Restrict 一样,仍在寻找答案 - 如果有人知道逻辑,请分享
当 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
【讨论】: