我们可以有一个外键,它不是任何其他表中的主键吗?

Mac*_*Mac 37 sql sql-server database-design foreign-keys

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

mar*_*c_s 43

是 - 您可以拥有一个引用另一个表中唯一索引的外键.

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)
Run Code Online (Sandbox Code Playgroud)

  • 这在Microsoft SQL Server中是正确的,但它不是标准SQL,并且不受所有其他DBMS支持.在ISO标准SQL中,没有索引这样的东西,并且总是需要FOREIGN KEY约束来匹配UNIQUE或PRIMARY KEY约束.就个人而言,我总是喜欢使用唯一约束而不是没有约束的唯一索引.我认为约束使得预期的含义更清晰,并且约束语法更可能被另一个数据库开发人员理解. (5认同)

nvo*_*gel 14

根据定义,外键必须引用某个表的候选键.它不一定是主键.

作为一个细节问题,SQL中称为FOREIGN KEY的约束并不完全等同于关系模型中外键的​​教科书定义.SQL的FOREIGN KEY约束不同,因为:

  • 它可以引用受唯一性约束限制的任何列集,即使它们不是候选键(例如,超级键或可为空的列).
  • 它可能包含空值,在这种情况下,不会强制执行约束
  • 其语法取决于列顺序,因此(A,B)引用(A,B)上的fk约束不同于(B,A)引用(A,B)上的约束.