外键和WHERE子句?

时间:2009-11-14 01:10:46

标签: mysql sql database

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

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

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

5 个答案:

答案 0 :(得分:5)

没有外键就可以正常工作。您需要查询中的JOIN表的外键/主键关系。

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

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

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

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

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

答案 1 :(得分:2)

外键约束与查询或如何在查询中连接表无关。存在以强制和控制数据一致性。

如果唯一可能的运送方式是 USPS FedEx ,则不应允许应用程序放置 Carrier Pigeon 在另一个表格的Shipping方法列中。

如果贵公司有两个办公地点,一个在纽约,一个在芝加哥,那么应禁止应用程序逻辑将 Boston 放入员工OfficeAssigned列

答案 2 :(得分:0)

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

您可以在任何条件下将两张桌子连在一起。这是关于您如何阅读和处理数据的。

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

答案 3 :(得分:0)

您需要确保数据一致。它将节省宝贵的时间,您可能会花费时间搜索指向丢失行的外键。

答案 4 :(得分:0)

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