在没有主键的情况下创建外键

时间:2011-03-26 13:57:42

标签: sql sql-server-2005 foreign-keys primary-key key

为什么必须在一个表的列上有一个主键,另一个表的列具有外键引用。

create table D(Did int)
create table E(Eid int foreign key references D(Did))

以上查询给出了错误:

There are no primary or candidate keys in the referenced table 'D' that match
the referencing column list in the foreign key 'FK__E__Eid__79C80F94'.

4 个答案:

答案 0 :(得分:17)

非常好的问题。引用约束不应引用候选键之外的其他内容,这没有根本原因。这种约束甚至有一个名称:包含依赖性。外键只是一种包含依赖项,其中约束的目标恰好是候选键。

不幸的是,SQL不能为包含依赖项提供良好的支持,甚至通常也不提供引用约束。 SQL将其所谓的FOREIGN KEY约束限制为引用UNIQUE或PRIMARY KEY约束的列(尽管不一定是候选键)。

所以你遇到的问题实际上是SQL的一个可疑限制。这并不意味着你做错了什么。

答案 1 :(得分:10)

易。如果父表中有2个相同的值,您如何知道将子行关联到哪个?  外键的一面必须是明确的

要求也是“唯一密钥”,而不仅仅是主键,当然是唯一的

答案 2 :(得分:1)

我认为PK是在内部使用的,所以sql server知道要操作的是哪一行。如果你没有PK并在两个不同的行上放置相同的值,那么sql server将无法处理命令。

答案 3 :(得分:0)

如果D上没有外键,E中的记录无法知道,哪条记录被引用。