外键变得复杂

时间:2014-05-18 04:29:59

标签: mysql sql sql-server foreign-keys

我是innoDB的初学者,数据库不是很好。我对外键感到困惑。我只想知道的是:

  • 如果我删除PK(另一张桌子上的fk)
    • 是否也删除了子表上的FK?
    • 那么如果我在子表上删除FK怎么样?
    • 父表中的记录也被删除了吗?
  • 此外,如果我将新记录添加到父表
    • 子表还添加了吗?
    • 我如何添加到子表?
    • 如果我更新数据怎么样?

请帮帮我,我对innoDB数据库中的外键引用很困惑。引导我走最简单的方法。感谢。

2 个答案:

答案 0 :(得分:1)

假设外键约束已定义,由存储引擎支持并已启用(即MySQL变量foreign_key_checks = 1,启用了Oracle外键约束而不是延迟等)。

问:如果删除PK(另一个表上的fk),子表上的FK是否也被删除了?

A:如果将DELETE规则指定为CASCADE,则父表上的删除也将对子表执行删除操作。如果将DELETE规则指定为RESTRICT,并且子表中有引用父键的行,则DELETE操作将引发错误。

EDIT:为了完整起见,我们注意到“SET NULL”是UPDATE或DELETE规则的另一个选项。)

问:如果我通过引用父表中的行从子表中删除一行,那么父表中的行也会被删除吗?

A:否。删除子表中的行不会影响父表中的行。

问:如果我将新行插入父表,还会将一行添加到子表>

A:否。行会自动插入子表。有一个父行没有引用它的任何子行是有效的(关系数据库)。

问:如果我将一行插入子表?

A:否。对子表的插入不会自动向父表插入行。 (将验证插入子表的外键列的任何非空值;数据库将验证父表中是否已存在具有匹配值的行。如果没有,则INSERT将失败,错误。)

问:如果我在子表中更新外键列的值,该怎么办。

A:与插入相同,新值将在更新操作进行之前得到验证。

问:如果更新父表中主键的值会怎样?

A:如果将外键的UPDATE规则指定为CASCADE,则子表中的相关行也将更新,以保留行之间的关系。如果UPDATE规则为RESTRICT,并且子表中存在相关行,则更新操作将引发错误。


外键旨在强制执行参照完整性。当外键列的新非空值未引用父级中的行时,它们基本上不允许子表中的插入/更新。

在外键约束上定义的UPDATE和CASCADE规则确定父表上的UPDATE和DELETE操作的行为。

答案 1 :(得分:0)

您所询问的是将更新/删除级联到子元素。

文档:http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html

示例:
CONSTRAINT FOREIGN KEY ( {jobAbbr {1}} {ffxi_jobType {1}} {jobAbbr {1}}

“ON DELETE CASCADE”意味着当删除密钥时,所有FK都被删除,这对数据完整性非常有用。然而,这不是自动的。

删除外键不会删除基于任何一种方式的密钥。