【问题标题】:Foreign key and the WHERE clause?外键和 WHERE 子句?
【发布时间】:2009-11-14 01:10:45
【问题描述】:

我不明白一件事。为什么我必须使用外键链接到另一个表中的主键?

当我查询时,我输入“where table1.foreignkeycolumn = table2.primarykeycolumn”。

如果我没有为主键分配外键,这不起作用吗?

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    没有外键也能正常工作。您确实不需要在查询中需要与 JOIN 表建立外键/主键关系。

    主键和外键的目的是指示数据库引擎本身执行以下测试,并拒绝未通过这些测试的数据:

    1. 对于声明为主键的列,每一行都必须有一个非 NULL 值,并且该值在表中的所有行中必须是唯一的。 (如果声明多列共同构成主键,则所有列必须包含非 NULL 值,并且值的组合必须在所有行中唯一)。

    2. 对于声明为外键的列,如果为行指定了值(如果没有另外指定,外键列可以包含 NULL 值),那么该值必须存在于链接的主键列。

    3. 对于声明为主键的列,如果您尝试删除行或更改主键值,则必须确保没有链接到该主键的外键列包含该值。

    它稍微复杂一点(例如,存在通过级联对外键表的更改来处理主键更新的方​​法),但这就是要点。 PK/FK 可以让数据库为您进行一些完整性检查,并保证关系将始终有效。

    【讨论】:

      【解决方案2】:

      外键约束与查询或查询中连接表的方式无关。它们的存在是为了强制和控制数据一致性。

      如果唯一可能的运输方式是 USPSFedEx,则不应允许申请Carrier Pigeon 在另一个表的运输方式列中。

      如果您的公司有两个办公地点,一个在纽约,一个在芝加哥,则应禁止应用程序逻辑将 波士顿 放在员工 OfficeAssigned 列中 p>

      【讨论】:

        【解决方案3】:

        select..where 可以正常工作,但是外键添加的是一个约束,它强制执行在表 1 的外键列中输入的键必须与表 2 中的现有值匹配的规则。

        您可以根据自己的喜好将两张桌子连接在一起。那是关于你如何读取和处理数据。

        外键和主键是关于强制约束和构建索引的。在几乎所有情况下,添加外键都是一种很好的做法,但不是必须的。

        【讨论】:

          【解决方案4】:

          您需要它来确保您的数据是一致的。这将节省您可能花费在搜索指向缺失行的外键上的宝贵时间。

          【讨论】:

            【解决方案5】:

            当您创建外键时,您添加了一个约束,换句话说,强制执行某些规则。在逻辑层面上它可以正常工作而无需实际创建一个。例如,带有 MyIsam 引擎的 MySQL 不支持外键约束,但您仍然可以在“逻辑”级别工作并在应用程序级别处理引用完整性。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-11-06
              • 2012-08-31
              • 2016-07-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-06-04
              • 1970-01-01
              相关资源
              最近更新 更多