设置表关系“Cascade”,“Set Null”和“Restrict”是做什么的?

时间:2011-03-21 20:56:50

标签: mysql phpmyadmin innodb relational-database

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

经过一些谷歌搜索后,我得到了2张表作为InnoDB:

我要链接的键是

- > users-> userid(primary) - > sessions-> userid(index)

我在这个过程中唯一不理解的是“On update”和“On delete”的不同设置

这里的选项是:

  • - (什么都没有?)
  • Cascade(???)
  • 设置Null(将所有内容设置为null?)
  • 没有动作(嗯......)
  • 限制(???)

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

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

2 个答案:

答案 0 :(得分:115)

当父级更改时,

CASCADE将传播更改。 (如果删除行,则引用该行的约束表中的行也将被删除,等等。)

当父行消失时,

SET NULL将列值设置为NULL。

RESTRICT导致父行的DELETE尝试失败。

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

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

答案 1 :(得分:16)

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

  

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

     

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

     

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

     

没有行动:没有行动和限制是非常相似的。当在引用的表上执行UPDATE或DELETE语句时,DBMS会在语句执行结束时验证没有任何引用关系违反。如果父行删除更新,则无需关注子行。