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

时间:2012-10-26 11:34:56

标签: php mysql sql foreign-keys

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

表人:

  primary key: PERSON_ID,
  NAME,
  SURNAME, etc.

TABLE地址:

  primary key: ADDRESS_ID,
  foreign key: PERSON_ID,
  addressLine1, etc.

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

4 个答案:

答案 0 :(得分:7)

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

因此,表格地址'架构应如下所示(假设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)
)

答案 1 :(得分:3)

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

假设您编写了应用程序,所有内容都经过测试,它就像魅力一样。很棒,但是谁说你每次都要改变一下你会在附近?您是要自己维护代码还是其他人可能最终会快速修复/调整或实施其他功能?实际上,你永远不会成为唯一一个编写和维护代码的人,即使你是唯一一个维护代码的人,随着时间的推移,你几乎肯定会遇到错误......外键告知您的同事和您,来自tbl1的数据取决于来自tbl2的数据,反之亦然。就像评论一样,这使得应用程序更易于维护。

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

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

请注意,FK并不是生命,宇宙和一切的最终答案(我们都知道这是42),但它们是真正的关系数据库设计的重要组成部分。< / p>

答案 2 :(得分:1)

Referential integrity是一篇你应该阅读和理解的文章。

答案 3 :(得分:1)

有两种方式

- 第一个是处理编码端的所有事情管理删除或更新记录的事情 但是当您使用外键时,您正在强制执行该关系,并且Db不允许您删除具有外键约束的记录,尤其是当您不想删除与其相关的记录时,在某些情况下会出现需要执行此操作的情况任务。

- 第二种方式是管理Db方面的事情。如果数据库中存在1对多或多对多关系,则外键非常有用。他们还有一些很好的动作 - RESTRICT,CASCADE,SET NULL,NO ACTION那些可以为你做一些工作