【问题标题】:create foreign key without a primary key创建没有主键的外键
【发布时间】:2011-07-23 12:03:31
【问题描述】:

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

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'.

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 但是,如果您想实现“至少一个”约束,那么根据定义,您不希望该约束仅引用一行。您还没有解释为什么不支持此类约束,我认为没有任何充分的理由。这只是一个愚蠢的限制,它是 SQL 对完整性约束的支持有多差的一个例子。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • D必须有一个主键或唯一列,每个外键引用另一个表中存在的列,所以E实际上有外键。
      • 这就是我写的。 D 中没有主键,E 中的(外键)记录不知道引用了 D 中的哪个(主键)。请收回您的反对票。谢谢。
      【解决方案4】:

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

      不幸的是,SQL 不能很好地支持包含依赖,甚至一般来说也不支持引用约束。 SQL 将其所谓的 FOREIGN KEY 约束限制为引用 UNIQUE 或 PRIMARY KEY 约束的列(但不一定是候选键)。

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

      【讨论】:

      • 这对现实生活有什么帮助。无论 SQL 是好是坏,您仍然需要在父表中引用唯一约束。 SO -1 对 OP 的问题的一个完全无用的答案:你说“SQL 坏了”。真好。
      • 我想我是唯一回答“为什么?”这个问题的人。我认为重要的是要指出这是一个软件限制,而不是给人以 OP 做错了什么的印象。问题不在于如何解决该错误,而在于解释它发生的原因。
      • 只有一个原因:所有关系核心都基于外键映射到唯一列这一事实。
      • @sqlvogel:关于Inclusion Dependencies 的观点非常好。从来不知道! +1
      • +1 以获得清晰的解释!附带说明一下,如果您有一个具有复合键(即多个主键)的表,并且您尝试在另一个键中仅引用其中一个键(而不是一组键/复合键),您将得到同样的错误。在这种情况下,请尝试在需要在另一个表中引用的列上创建唯一索引。这是一个链接:sql-server-helper.com/error-messages/msg-1776.aspx
      猜你喜欢
      • 2020-10-03
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      相关资源
      最近更新 更多