为什么必须在一个表的列上有一个主键,另一个表的列具有外键引用。
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'.
答案 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中的记录无法知道,哪条记录被引用。