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

sql*_*ild 11 sql sql-server-2005 key foreign-keys primary-key

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

create table D(Did int)
create table E(Eid int foreign key references D(Did))
Run Code Online (Sandbox Code Playgroud)

上面的查询给出了错误:

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

nvo*_*gel 17

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

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

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

  • 我想我是唯一回答这个问题的人,那就是"为什么?".我认为重要的是要指出这是一个软件限制,而不是给人的印象是OP做错了.问题不是如何解决错误,而是解释它为什么会发生. (5认同)
  • @sqlvogel:关于“包含依赖”的观点非常好。从来不知道!+1 (2认同)
  • +1 清楚的解释!作为旁注,如果您有一个具有复合键(即多个主键)的表,并且您尝试在另一个键(而不是一组键/复合键)中仅引用这些键中的一个,您将得到同样的错误。在这种情况下,尝试在需要在另一个表中引用的列上创建唯一索引。这是一个链接:http://www.sql-server-helper.com/error-messages/msg-1776.aspx (2认同)

gbn*_*gbn 10

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

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