你需要在MySQL中设置外键吗?

use*_*396 6 php mysql sql foreign-keys

假设您在MySQL数据库中有两个如下表:

表人:

  primary key: PERSON_ID,
  NAME,
  SURNAME, etc.
Run Code Online (Sandbox Code Playgroud)

表地址:

  primary key: ADDRESS_ID,
  foreign key: PERSON_ID,
  addressLine1, etc.
Run Code Online (Sandbox Code Playgroud)

如果你管理行的创建(在两个表中)和通过PHP检索数据,你还需要在数据库中创建一个物理关系吗?如果是,为什么?

Joh*_*Woo 8

是的,一个具体原因是如果要连接表,可以更快地检索行.创建外键约束会自动在列上创建索引.

所以表地址'schema应该是这样的,(假设People表的主键是PERSON_ID)

CREATE TABLE Address
(
    Address_ID INT,
    Person_ID INT,
    ......,
    CONSTRAINT tb_pk PRIMARY KEY (Address_ID),
    CONTRRAINT tb_fk FOREIGN KEY (Person_ID) 
        REFERENCES People(Person_ID)
)
Run Code Online (Sandbox Code Playgroud)


Eli*_*gem 5

严格来说:您不需要使用 FK。仔细的索引和写得很好的查询似乎就足够了。然而,在确保数据一致性(例如,避免孤立数据)方面,FK 和当然 FK 约束非常有用

假设您编写了您的应用程序,所有内容都经过测试,并且效果很好。太好了,但谁能说每次必须改变时你都会在身边?您是要自己维护代码,还是其他人可能最终会进行快速修复/调整或实现​​其他功能?实际上,您永远不会是唯一一个编写和维护代码的人,即使您是唯一一个维护代码的人,随着时间的推移,您几乎肯定会遇到错误......
外键通知两者您的同事和您的 tbl1 中的数据取决于 tbl2 中的数据,反之亦然。就像注释一样,这使应用程序更易于维护。

错误更容易检测:创建一个从 tbl1 中删除记录的方法,但忘记更新 tbl2 以反映对第一个 tbl 所做的更改。发生这种情况时,数据已损坏,但导致此问题的查询不会导致错误:SQL 在语法上是正确的,并且它执行的操作是所需的操作。这些错误可能会隐藏相当长一段时间,当它被发现时,天知道有多少数据已损坏......

最后,这是一个经常使用的参数,如果与数据库的连接在一系列更新/删除查询中途丢失怎么办?FK 约束使您能够级联某些操作。我实际上并没有看到这种情况发生,但我知道有人不编写代码来防止这种情况
删除或更新几个关系记录,但在中途,与数据库的连接由于某种原因被切断. 您可能已经编辑了 tbl2,但在发送到 tbl1 的查询之前连接丢失。同样,我们最终会得到损坏的数据。
FKCASCADE的是非常有用的在这里。从 tbl1 中删除,并设置一个ON DELETE CASCADE规则,让你放心,相关记录从tbl2中删除。在同样的情况下,ON DELETE RESTRICT, 也可以是一个相当有用的规则。

请注意,FK 并不是对生命、宇宙和一切事物(即 42 - 众所周知)的最终答案,但它们是真正的关系数据库设计的重要组成部分。