【问题标题】:Setting up table relations what do "Cascade", "Set Null" and "Restrict" do?设置表关系“Cascade”、“Set Null”和“Restrict”有什么作用?
【发布时间】:2011-07-20 00:13:49
【问题描述】:

我想在一个新项目中开始使用表关系。

经过一番谷歌搜索后,我将 2 个表设置为 InnoDB:

我要链接的键是

->users->userid(主要) ->会话->用户ID(索引)

在这个过程中我唯一不明白的是“更新时”和“删除时”的不同设置是做什么的

这里的选项是:

  • --(什么都没有?)
  • 级联 (???)
  • Set Null(将所有内容都设置为 null?)
  • 无动作(嗯……)
  • 限制 (???)

我基本上希望在完全删除用户时删除会话中的数据 这是因为只有当我的会话管理器检测到过期时才会删除会话...

因此,如果有人能告诉我这些选项的作用,将不胜感激。

【问题讨论】:

    标签: mysql phpmyadmin innodb relational-database


    【解决方案1】:

    CASCADE 将在父级更改时传播更改。 (如果您删除一行,那么引用该行的约束表中的行也将被删除,等等)

    SET NULL 在父行消失时将列值设置为 NULL。

    RESTRICT 导致尝试删除父行失败。

    编辑:您没有询问它们,但 SQL 标准定义了另外两个操作:SET DEFAULTNO ACTION。在 MySQL 中,NO ACTION 等价于 RESTRICT。 (在某些 DBMS 中,NO ACTION 是延迟检查,但在 MySQL 中,所有检查都是立即的。)MySQL 解析器接受 SET DEFAULT,但 InnoDB 和 NDB 引擎都拒绝这些语句,因此 SET DEFAULT 实际上不能用于ON UPDATEON DELETE 约束。

    另外,请注意级联外键操作不会激活 MySQL 中的触发器。

    【讨论】:

    • 谢谢 Ted,我已将其设置为 On Delete: Cascade 和 On Update: Do Nothing 并对其进行了测试,似乎它确实想要我想要它做
    【解决方案2】:

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

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

    CASCADE :当父级更改时,CASCADE 将传播更改。如果您删除一行,受限表中引用该行的行也将被删除,等等。

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多