【发布时间】:2009-11-14 01:10:45
【问题描述】:
我不明白一件事。为什么我必须使用外键链接到另一个表中的主键?
当我查询时,我输入“where table1.foreignkeycolumn = table2.primarykeycolumn”。
如果我没有为主键分配外键,这不起作用吗?
【问题讨论】:
我不明白一件事。为什么我必须使用外键链接到另一个表中的主键?
当我查询时,我输入“where table1.foreignkeycolumn = table2.primarykeycolumn”。
如果我没有为主键分配外键,这不起作用吗?
【问题讨论】:
没有外键也能正常工作。您确实不需要在查询中需要与 JOIN 表建立外键/主键关系。
主键和外键的目的是指示数据库引擎本身执行以下测试,并拒绝未通过这些测试的数据:
对于声明为主键的列,每一行都必须有一个非 NULL 值,并且该值在表中的所有行中必须是唯一的。 (如果声明多列共同构成主键,则所有列必须包含非 NULL 值,并且值的组合必须在所有行中唯一)。
对于声明为外键的列,如果为行指定了值(如果没有另外指定,外键列可以包含 NULL 值),那么该值必须存在于链接的主键列。
对于声明为主键的列,如果您尝试删除行或更改主键值,则必须确保没有链接到该主键的外键列包含该值。
它稍微复杂一点(例如,存在通过级联对外键表的更改来处理主键更新的方法),但这就是要点。 PK/FK 可以让数据库为您进行一些完整性检查,并保证关系将始终有效。
【讨论】:
外键约束与查询或查询中连接表的方式无关。它们的存在是为了强制和控制数据一致性。
如果唯一可能的运输方式是 USPS 和 FedEx,则不应允许申请Carrier Pigeon 在另一个表的运输方式列中。
如果您的公司有两个办公地点,一个在纽约,一个在芝加哥,则应禁止应用程序逻辑将 波士顿 放在员工 OfficeAssigned 列中 p>
【讨论】:
select..where 可以正常工作,但是外键添加的是一个约束,它强制执行在表 1 的外键列中输入的键必须与表 2 中的现有值匹配的规则。
您可以根据自己的喜好将两张桌子连接在一起。那是关于你如何读取和处理数据。
外键和主键是关于强制约束和构建索引的。在几乎所有情况下,添加外键都是一种很好的做法,但不是必须的。
【讨论】:
您需要它来确保您的数据是一致的。这将节省您可能花费在搜索指向缺失行的外键上的宝贵时间。
【讨论】:
当您创建外键时,您添加了一个约束,换句话说,强制执行某些规则。在逻辑层面上它可以正常工作而无需实际创建一个。例如,带有 MyIsam 引擎的 MySQL 不支持外键约束,但您仍然可以在“逻辑”级别工作并在应用程序级别处理引用完整性。
【讨论】: