我想在新项目中开始使用表关系。
经过一些谷歌搜索后,我得到了2张表作为InnoDB:
我要链接的键是
- > users-> userid(primary) - > sessions-> userid(index)
我在这个过程中唯一不理解的是“On update”和“On delete”的不同设置
这里的选项是:
我基本上希望在完全删除用户时删除会话中的数据 这是因为会话只会在我的会话管理器检测到到期时删除...
因此,如果有人能告诉我这些选项的作用,那将非常感激。
答案 0 :(得分:115)
CASCADE
将传播更改。 (如果删除行,则引用该行的约束表中的行也将被删除,等等。)
SET NULL
将列值设置为NULL。
RESTRICT
导致父行的DELETE尝试失败。
编辑:您没有询问它们,但SQL标准定义了另外两个操作:SET DEFAULT
和NO ACTION
。在MySQL中,NO ACTION
相当于RESTRICT
。 (在某些DBMS中,NO ACTION
是延迟检查,但在MySQL中,所有检查都是立即检查。)MySQL解析器接受SET DEFAULT
,但InnoDB和NDB引擎都拒绝这些语句,因此{{1} }实际上无法用于SET DEFAULT
或ON UPDATE
约束。
另请注意,级联外键操作不会激活MySQL中的触发器。
答案 1 :(得分:16)
包含外键的表称为引用或子表,包含候选键的表称为引用或父表。
设置NULL :删除父表行时,将列值设置为 NULL 。
CASCADE :当父级更改时,CASCADE将传播更改。如果删除行,引用该行的约束表中的行也将被删除等。
RESTRICT :如果存在引用该父行的值的子行,则RESTRICT会导致您无法删除给定的父行。
没有行动:没有行动和限制是非常相似的。当在引用的表上执行UPDATE或DELETE语句时,DBMS会在语句执行结束时验证没有任何引用关系违反。如果父行删除或更新,则无需关注子行。