它写在每本书中,外键实际上是其他表中的主键,但是我们可以有一个外键在任何其他表中都不是主键我们可以有一个外键不是任何其他表中的主键吗?
回答
是的 - 你可以有一个外键引用另一个表中的唯一索引。
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)
这在Microsoft SQL Server中是正确的,但它不是标准SQL,并且不受所有其他DBMS支持。在ISO标准SQL中,不存在索引和FOREIGN KEY约束,总是需要匹配UNIQUE或PRIMARY KEY约束。就我个人而言,我总是喜欢使用唯一约束而不是没有约束的唯一索引。我认为约束使得预期意义更清晰,而约束语法更可能被另一个数据库开发人员理解。 – sqlvogel 2010-05-24 08:51:29
@David:是的,但OP在询问SQL Server ..... – 2010-05-24 08:59:25
按照定义,外键必须引用某个表的候选键。它不一定是主键。
详细而言,在SQL中称为FOREIGN KEY的约束与关系模型中外键的教科书定义并不完全等价。 SQL的外键约束不同,因为:
- 它可以引用任何一套符合唯一性约束列,即使他们不是候选键(superkeys或例如空列)。 (A,B)引用(A,B)上的fk约束与(B,B)上的约束不同,因此它的语法依赖于列顺序, ,A)参照(A,B)。
APC不确定为什么要编辑这个以将“SQL”替换为“SQL Server”。我的意见适用于SQL(意思是由ISO定义的标准语言)。它们适用于我熟悉的SQL的所有实现 - 不仅仅是SQL Server。 – sqlvogel 2010-05-24 13:22:53
是的,这些人在编辑帖子时不知道自己在做什么,这是什么?我投票拒绝编辑回答。 – PerformanceDBA 2010-11-25 12:03:17
是的,在其他表中可以有一个外键是唯一键,唯一键是主键的子集,但不是确切的主键。
所以这可能是外键是另一个表中的唯一键。
一般标准答案是否定的。只有外键引用其他表中唯一的任何列时才有可能。这意味着外键必须是其他表中的候选键,并且主键也是该表的候选键。
- 1. 外键可以是另一个表的复合主键的一部分吗?
- 2. 我可以在数据库中只有外键而不是主键吗?
- 3. 我可以有一个表与数据库的外键但没有主键
- 4. 我可以有一个非空的hashmap,其中没有任何键吗?
- 5. 在Java中我可以有一个键 - 键映射(而不是键值)吗?
- 6. 更改其他表中外键引用的表的主键列
- 7. 我们可以添加主键破表
- 8. 我需要设置为其他表中的组合主键之一的外键
- 9. 我可以从两个表中分配一个外键吗?
- 10. 删除不影响外键约束到其他表的主键
- 11. Rails:我可以使用外键作为一对一关系中的主键吗?
- 12. 我们可以更新表的主键值吗?
- 13. 如果我有一个复杂的主键,是否有可能仅为其中的一列创建外键?
- 14. Mysql外键引用两个列,它们是两个不同表中的主键
- 15. 单个外键可以指向多个主键吗?
- 16. 我可以有两个外键的表吗?
- 17. 数据库属性可以是主键和外键吗?
- 18. MySQL:如何查找某个特定主键在其他表中的外键?
- 19. 可以将数据库中所有表的主键作为一个表的外键引用吗?
- 20. 我们可以在实体框架中没有主键的表吗?
- 21. 每个表有四个外键不能引用主表中的单个主键
- 22. 同一表中的主键和外键
- 23. JPA:一个表的主键和另一个表的主键和外键
- 24. 为什么(默认)外键是空的? 。 。并且外键和主键可以是同一列吗?
- 25. 如何使一个表的主键,同一表的外键
- 26. 确定外键表是否有与LINQ&DataTable的主键表的任何链接
- 27. Linq2Sql:我可以使用外键关系在两个表中没有主键的情况下创建实体吗?
- 28. 如何从主表键和外键在同一个表中删除主键。
- 29. 使用来自其他表主键的所有外键填充表
- 30. 是否可以不使用主键当我不需要一个
你为什么想要? – JeffO 2010-05-24 12:17:27
有没有什么具体的理由有人问我这个,我感到困惑多数民众赞成为什么我只是想知道这就是它 – Mac 2010-05-24 12:22:30
为什么?那么这取决于你选择主键的原因是什么 - 从正式的角度来说,选择一个主键而非另一个主键没有绝对的理由,所以没有特别的理由来说明它为什么会相同或不相同一个用于外键引用。此外,在某些情况下,可能希望每个表使用多个候选键作为外键引用。在这种情况下,其中一个引用显然不是主键 - 除非您想要调用多个键“主”键! – sqlvogel 2010-05-24 12:34:01