94

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

我不能从 MySQL 文档本身中得到它。到目前为止,我一直在处理诸如外键连接和编程代码之类的事情。

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

4

4 回答 4

122

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))

, 那么你不能删除 adepartment如果它有一些employee's。

如果您提供ON DELETE CASCADE定义FOREIGN KEY,引用行将与被引用行一起自动删除。

作为一个约束,FOREIGN KEY实际上会减慢查询速度。

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

于 2009-04-16T17:30:56.823 回答
32

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

例如,假设您正在编写一个论坛。您有一个带有主键的“主题”表topics.topic_id,并且您有一个“帖子”表,其中帖子附加到带有列的主题,该列posts.topic_id是主题表的外键。

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

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

于 2009-04-16T17:33:52.073 回答
11

1.外键只是确保您的数据是一致的。

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

3.如果我们对外键定义应用更新级联,当父行更新时,子行将自动更新。

查询:ALTER TABLE child ADD FOREIGN KEY(parent_id) REFERENCES parent(id) ON UPDATE CASCADE ON DELETE CASCADE ;

  1. 您不能直接删除父表,首先从子表中删除外键而不是删除父表。
于 2015-09-10T07:22:52.687 回答
7

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

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

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

于 2009-04-16T17:31:25.217 回答