主键或唯一列上的SQL外键

时间:2012-01-24 13:54:35

标签: sql join foreign-keys primary-key unique

假设我有两个表,表A和表B,表A包含以下列:

COLUMNS (id INT PRIMARY KEY, name VARCHAR(200) UNIQUE)

我想在表B中创建一个列,该列使用外键引用表A的一行。 大多数时候,当我在表B中查找一行时,我还想要检索它引用的表A行中的名称字段。 查找速度(但不是插入)是一个问题。

使用表A的主键作为外键,然后使用JOIN来引入name字段的值,或者使用name字段作为外键更好吗?在表B中查找一行时,该数据是否已存在?

3 个答案:

答案 0 :(得分:4)

通常名称可以更改。可能有人找到了更好的名字,或者名称中有一个错字必须得到纠正。而PK永远不会改变。始终将ID用作FK。这就是查找表的工作方式。

如果您使用标识列作为PK,则ID将自动生成且无法更改。拥有一个没有意义的PK是一个好主意。有意义的列往往是编辑的主题。

答案 1 :(得分:2)

最好使用表A的主键作为外键,然后使用JOIN引入名称字段的值,只需将所有内容放入表B中

答案 2 :(得分:0)

在您的示例中,“name”是一个可为空的列,因此它不是候选键。假设外键约束引用候选键(例如,在这种情况下为“Id”)。我建议您更改表格以使“名称”不可为空或引用ID。

SQL中的Nullable UNIQUE和FOREIGN KEY约束可以在不同的数据库产品中以不同的方式实现。它们的含义有时含糊不清,使用它们的结果往往是矛盾的,可能与现实不符。

(可能是允许空值只是你的CREATE TABLE语句中的一个疏忽 - 在这种情况下我建议你修改这个问题。)