【问题标题】:Mysql workbench foreign key options [Restrict, Cascade, Set Null, No Action], what do they do?Mysql工作台外键选项【Restrict、Cascade、Set Null、No Action】,它们有什么作用?
【发布时间】:2013-04-16 07:27:23
【问题描述】:

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

【问题讨论】:

标签: mysql-workbench


【解决方案1】:

如果你一个一个拿:

对于更新和删除:

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

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

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

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

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

【讨论】:

  • “restrict”和“no action”是一样的。 Restrict 是 mysql 唯一的关键字,而“no action”是 SQL 标准。
  • @ProfileTwist 不,我的理解是如果有记录,“限制”将取消更新/删除操作(您必须先删除子行),相反“无操作”会让您更新/删除记录,即使有子行
  • @glautro 查看stackoverflow.com/questions/5809954/…。也许某些引擎可以按照您的描述工作,但在 Innodb 中,除非暂时禁用外键检查,否则无法更新/删除父行并创建孤立子行。这对于数据完整性来说非常棒(如果这是您试图通过 FK 实现的)
【解决方案2】:

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

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中,如果删除父级,这是不允许的吗?在父更新的情况下,子是否保持不变?
  • @pathros no Dear ,这意味着子表不会发生任何变化,只会影响父表 - 无论是删除还是更新 - 这意味着只会删除父表(在删除情况下)和所有孩子都将保持原样
  • 我知道这迫使我们问为什么它和Restrict 一样,仍在寻找答案 - 如果有人知道逻辑,请分享
  • 哪个是父母,哪个是孩子?一个例子真的很有帮助:-)
【解决方案3】:

当 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

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多