【问题标题】:can we have a foreign key which is not a primary key in any other table?我们可以有一个不是任何其他表中的主键的外键吗?
【发布时间】:2011-02-23 03:00:25
【问题描述】:

每本书都写到外键实际上是其他表中的主键,但是我们可以在任何其他表中拥有一个不是主键的外键

【问题讨论】:

  • 没有具体原因有人问我这个问题,我很困惑这就是为什么我只想知道就是这样
  • 为什么?好吧,这首先取决于您选择主键的原因-正式地说,没有绝对的理由选择一个主键而不是另一个主键,因此没有特别的理由可以说明为什么会或不会相同一种用于外键引用。此外,在某些情况下,可能需要为每个表使用多个候选键作为外键引用。在这种情况下,其中一个引用显然不是主键 - 除非您想将多个键称为“主”键!

标签: sql sql-server database-design foreign-keys


【解决方案1】:

一般标准答案是否定的。仅当外键唯一地引用其他表中的任何列时才有可能。这意味着外键必须是其他表的候选键,主键也是该表的候选键。

【讨论】:

    【解决方案2】:

    是的,可以有一个外键是其他表中的唯一键,因为唯一键是主键的子集,但不是确切的主键。

    所以外键可能是另一个表中的唯一键。

    【讨论】:

      【解决方案3】:

      根据定义,外键必须引用某个表的候选键。它不一定是主键。

      详细地说,SQL 中称为 FOREIGN KEY 的约束并不完全等同于关系模型中外键的​​教科书定义。 SQL 的 FOREIGN KEY 约束不同,因为:

      • 它可以引用任何受唯一性约束的列集,即使它们不是候选键(例如超级键或可为空的列)。
      • 它可能包含空值,在这种情况下不强制执行约束
      • 其语法取决于列顺序,因此 (A,B) 引用 (A,B) 的 fk 约束不同于 (B,A) 引用 (A,B) 的约束。

      【讨论】:

      • APC 不确定您为什么要编辑它以将“SQL”替换为“SQL Server”。我的 cmets 适用于 SQL(即 ISO 定义的标准语言)。它们适用于我熟悉的所有 SQL 实现——不仅仅是 SQL Server。
      • 是的,这些人在不知道自己在做什么的情况下编辑帖子是怎么回事。我投票赞成禁止对答案进行编辑。
      【解决方案4】:

      是的 - 您可以拥有一个引用另一个表中的唯一索引的外键。

      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 约束。就个人而言,我总是更喜欢使用唯一约束而不是没有约束的唯一索引。我认为约束使预期含义更清晰,并且约束语法更容易被其他数据库开发人员理解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2011-11-19
      相关资源
      最近更新 更多