MySQL中外键的基础?


91

关于如何使用MySQL的外键构造有什么好的解释?

我不太了解MySQL文档本身。到目前为止,我一直在通过联接和编程代码处理诸如外键之类的事情。

问题的第二部分,使用MySQL的内置外键是否有任何改进?

Answers:


117

FOREIGN KEYS 只要确保您的数据是一致的。

他们没有从效率上改善查询,只是使一些错误的查询失败。

如果您有这样的关系:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

,那么你就不能删除department,如果它有一些employee的。

如果你提供ON DELETE CASCADEFOREIGN KEY定义,引用行会自动与引用的那些一起被删除。

作为约束,FOREIGN KEY实际上会使查询变慢了一点。

从引用表中删除或插入引用表时,需要执行额外的检查。


1
减慢速度很小,因为您通常在索引字段上使用FK,这样就可以轻松找到相关值。
勒布

4
这就是为什么我写了“一点”的原因:)实际上,在您删除大量行的过程中,底层的JOIN效率可能比使用FULL TABLE SCAN的两个DELETE效率低
Quassnoi

2
对不起,投下反对票。这是偶然的,但不允许我更改投票。
Wondercricket 2015年

8
@Wondercricket:我什至都不知道该怎么办,这是网站规则中的灰色区域。我想您在莫斯科时甚至还给我买了啤酒。
Quassnoi

1
@stack:您对引用键所做的任何更新都会级联到引用表。
Quassnoi

32

使用实际外键的主要好处是确保数据完整性,并能够在修改或删除某些内容时对相关项目设置级联操作。

例如,假设您正在编程一个论坛。您有一个具有主键的“主题”表topics.topic_id,而您有一个“帖子”表,其中的帖子通过column附加到主题posts.topic_id,这是主题表的外键。

这种外键关系确保每个帖子都附加到有效主题。如果您唯一的主题的ID为#1,则不可能在数据库中存在与主题#2关联的帖子。数据库确保了这一点。

为了获得级联的好处,您可以对其进行设置,以便在从主题表中删除主题时,数据库自动删除该主题所附的帖子表中的所有帖子。这很好,因为它消除了您必须记住要手动执行的步骤,当您将许多表链接在一起时,该步骤可能会变得非常复杂。使用外键,可以自动清除所有关系。


11

1.FOREIGN KEYS仅确保您的数据一致。

2.如果对外键定义应用删除级联,则在父行删除时引用行将自动删除。

3.如果我们在U​​pdate Cascade上应用外键定义,则在父行更新时,子行将自动更新。

查询:ALTER TABLE子项ADD FOREIGN KEY(parent_id)参考parent(id)ON UPDATE CASCADE ON DELETE CASCADE;

  1. 您不能删除直接父表,首先要从子表中删除外键,而不要删除父表。

7
终于意识到使我对外键示例感到困惑的地方。作为四个孩子的父亲,我不习惯孩子跟踪父母。再过四十年左右,这似乎不再倒退。
鲍勃·斯坦

1
感谢您为示例表格指定了“ child”和“ parent”之类的名称……这实际上很有帮助,我希望官方文档能够做到这一点!
麦克啮齿动物

7

主要优点是您可以限制可以在表中输入的值。如果您尝试输入引用表中不存在的值,则将无法执行该操作。

另外,如果您更新或删除引用表中的值,则可以将其设置为自动更新值或级联删除包含该值的任何行。

利用代码确实是一个很棒的功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.