【问题标题】:Creating relationship to non-primary column创建与非主列的关系
【发布时间】:2012-10-15 11:58:57
【问题描述】:

我有一个表,它引用了主表的外键。但我想添加对另一个表的其他引用。

例如,假设我有三个表:Child, Parent, Transaction

父表:

  • 父母ID

子表:

  • 孩子ID
  • 父母ID

交易表:

  • 交易 ID
  • ParentID(引用 ParentID on Parent 表,可为空
  • ChildID(引用 ChildID on Child 表,可为空

我想为ParentID on Child 表添加一个cascade on update 引用。这样当父子关系发生变化时,Transaction 表上的ParentID 将自动更新。

【问题讨论】:

  • 问题是什么?您在哪里遇到问题?
  • 我想像这样添加外键:ALTER TABLE [Transaction] WITH CHECK ADD CONSTRAINT [FK_Name] FOREIGN KEY([ParentID]) REFERENCES [Child] ([ParentID]) CASCADE ON UPDATE
  • 为什么需要 Transaction 表中的 ParentID?您可以在子表中找到带有 ChildID 的 parentID。
  • @Wim 有时我只需要 ParentID,所以我只保存 ParentID。有时我只需要 ChildID,所以我只保存 ChildID。如果我只有 ChildID 列,那么当我只需要保存 ParentID 时,我不会保存 ParentID。

标签: sql-server foreign-keys


【解决方案1】:

显然,ParentID 不是Child 表上的主键。

此列在整个表中是唯一的吗?

  • 如果是:您可以在 Child 表的 ParentID 上定义唯一索引,然后将 FK 引用添加到该唯一索引

  • 如果 NO:如果 Child 上的 ParentID 不是唯一的,那么您不能创建一个 FK 引用它。 FK 引用的“目标”必须是该表的主键,或者至少是该表上的唯一列。否则,如果您有 ParentID = 42 并且值 not 唯一,那么您指的是哪一行?!?!?

简单地说,我希望 Transaction 表上 ParentID&ChildID 列上的值对与 Child 表上 ParentID&ChildID 列上的值对相同

在这种情况下,您需要在 两列 上建立 FK 关系 - 像这样创建它:

CREATE UNIQUE INDEX UX_ParentChild
ON dbo.Child(ParentID, ChildID)

ALTER TABLE dbo.Transaction
ADD CONSTRAINT FK_Transaction_Child
FOREIGN KEY(ParentID, ChildID) REFERENCES dbo.Child(ParentID, ChildID)
ON UPDATE CASCADE

【讨论】:

  • ParentID 不是 Child 表的主键,但它是 Parent 表的外键。简单地说,我希望我的 Transaction 表上的ParentID&ChildID 列 上的值对与子表上的ParentID&ChildID 列 我怎样才能实现呢?
  • 我收到以下错误:引用表“dbo.Child”中没有与外键“FK_Transaction_Child”中的引用列列表匹配的主键或候选键。
  • @Fer:您需要首先在这两列(Child 表上)上创建一个 唯一索引 - 如果可行,那么您可以创建 FK 关系.查看我再次更新的回复
猜你喜欢
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多