2010-05-24 63 views
35

它写在每本书中,外键实际上是其他表中的主键,但是我们可以有一个外键在任何其他表中都不是主键我们可以有一个外键不是任何其他表中的主键吗?

+0

你为什么想要? – JeffO 2010-05-24 12:17:27

+0

有没有什么具体的理由有人问我这个,我感到困惑多数民众赞成为什么我只是想知道这就是它 – Mac 2010-05-24 12:22:30

+0

为什么?那么这取决于你选择主键的原因是什么 - 从正式的角度来说,选择一个主键而非另一个主键没有绝对的理由,所以没有特别的理由来说明它为什么会相同或不相同一个用于外键引用。此外,在某些情况下,可能希望每个表使用多个候选键作为外键引用。在这种情况下,其中一个引用显然不是主键 - 除非您想要调用多个键“主”键! – sqlvogel 2010-05-24 12:34:01

回答

40

是的 - 你可以有一个外键引用另一个表中的唯一索引。

CREATE UNIQUE INDEX UX01_YourTable ON dbo.YourTable(SomeUniqueColumn) 

ALTER TABLE dbo.YourChildTable 
    ADD CONSTRAINT FK_ChildTable_Table 
    FOREIGN KEY(YourFKColumn) REFERENCES dbo.YourTable(SomeUniqueColumn) 
+5

这在Microsoft SQL Server中是正确的,但它不是标准SQL,并且不受所有其他DBMS支持。在ISO标准SQL中,不存在索引和FOREIGN KEY约束,总是需要匹配UNIQUE或PRIMARY KEY约束。就我个人而言,我总是喜欢使用唯一约束而不是没有约束的唯一索引。我认为约束使得预期意义更清晰,而约束语法更可能被另一个数据库开发人员理解。 – sqlvogel 2010-05-24 08:51:29

+4

@David:是的,但OP在询问SQL Server ..... – 2010-05-24 08:59:25

13

按照定义,外键必须引用某个表的候选键。它不一定是主键。

详细而言,在SQL中称为FOREIGN KEY的约束与关系模型中外键的​​教科书定义并不完全等价。 SQL的外键约束不同,因为:

  • 它可以引用任何一套符合唯一性约束列,即使他们不是候选键(superkeys或例如空列)。 (A,B)引用(A,B)上的fk约束与(B,B)上的约束不同,因此它的语法依赖于列顺序, ,A)参照(A,B)。
+0

APC不确定为什么要编辑这个以将“SQL”替换为“SQL Server”。我的意见适用于SQL(意思是由ISO定义的标准语言)。它们适用于我熟悉的SQL的所有实现 - 不仅仅是SQL Server。 – sqlvogel 2010-05-24 13:22:53

+0

是的,这些人在编辑帖子时不知道自己在做什么,这是什么?我投票拒绝编辑回答。 – PerformanceDBA 2010-11-25 12:03:17

3

是的,在其他表中可以有一个外键是唯一键,唯一键是主键的子集,但不是确切的主键。

所以这可能是外键是另一个表中的唯一键。

0

一般标准答案是否定的。只有外键引用其他表中唯一的任何列时才有可能。这意味着外键必须是其他表中的候选键,并且主键也是该表的候选键。

相关问题