MySQL中的外键基础知识?

Mac*_*cha 89 mysql foreign-keys

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

我不太了解MySQL文档本身.到目前为止,我一直在使用连接和编程代码来处理外键.

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

Qua*_*noi 116

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))
Run Code Online (Sandbox Code Playgroud)

,department如果它有一些,你就不能删除它employee.

如果提供ON DELETE CASCADEFOREIGN KEY定义,则引用行将与引用的行一起自动删除.

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

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

  • @Wondercricket:我现在甚至不知道该怎么做,这是网站规则中的灰色区域.我想你在莫斯科的时候给我买啤酒,我们甚至都是. (8认同)
  • 这就是为什么我写了"一点点":)实际上,你删除了很多行,底层的`JOIN`可能效率低于两个DELETE使用FULL TABLE SCAN的 (4认同)
  • 对不起投票.这是偶然的,但它不允许我改变我的投票. (2认同)

Cha*_*rch 31

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

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

此外键关系可确保每个帖子都附加到有效主题.如果您拥有的唯一主题是ID#1,那么在主题#2附带的数据库中就不可能存在帖子.数据库确保了这一点.

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


Gau*_*mar 11

1.FOREIGN KEYS只是确保您的数据一致.

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

3.如果我们将Update Cascade应用于外键定义,则当父行将更新时,Child行将自动更新.

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

  1. 你不能删除直接父表,首先从子表中删除外键比删除父表.

  • 终于意识到让我对外键的例子感到困惑.作为四个孩子的父亲,我不习惯**孩子跟踪父母**.再过四十年左右,这似乎不再是倒退. (7认同)

Seb*_*Seb 6

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

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

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