【问题标题】:Do you need to set foreign keys in MySQL?你需要在 MySQL 中设置外键吗?
【发布时间】:2012-10-26 11:34:55
【问题描述】:

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

表人:

  primary key: PERSON_ID,
  NAME,
  SURNAME, etc.

表地址:

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

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

【问题讨论】:

标签: php mysql sql foreign-keys


【解决方案1】:

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

所以表地址的模式应该是这样的,(假设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)
)

【讨论】:

    【解决方案2】:

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

    假设您编写了自己的应用程序,一切都经过了测试,并且它的运行就像一个魅力。太好了,但谁能说每次必须改变某些事情时你都会在附近呢?您是要自己维护代码,还是其他人最终可能会进行快速修复/调整或实现​​其他功能?实际上,您永远不会是唯一一个编写和维护代码的人,即使您是唯一一个维护代码的人,随着时间的推移,您几乎肯定会遇到错误...
    外国密钥会告知您的同事和您来自 tbl1 的数据取决于来自 tbl2 的数据,反之亦然。就像 cmets 一样,这使应用程序更易于维护。

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        有两种方法

        -第一个是处理编码端的所有事情 管理删除或更新记录的事情 但是当您使用外键时,您正在执行关系,并且 Db 不允许您删除具有外键约束的记录,特别是当您不想删除与其相关的记录时,在某些情况下您需要这样做种任务。

        -第二种方法是在 Db 端管理事物。如果您在数据库中有一对多或多对多的关系,外键将非常有用。他们也有一些很好的行动 - RESTRICT, CASCADE, SET NULL, NO ACTION 这些可以为你做一些工作

        【讨论】:

          猜你喜欢
          • 2011-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-13
          • 1970-01-01
          • 2011-08-24
          • 2016-03-01
          • 1970-01-01
          相关资源
          最近更新 更多