【问题标题】:Two FK to one PK两个FK对一个PK
【发布时间】:2013-10-15 08:08:21
【问题描述】:

我正在使用 SQL Server Express 2012 并尝试建立两个关系,从同一个表中的两个 FK 到另一个表中的一个 PK。

该关系似乎有效,因为它显示在数据库图中,但是当我尝试保存更改时,我收到以下错误:

“会员”表保存成功 'BookedResources' 表 - 无法创建关系“FK_BookedResourcesMemberId_MembersMemberId”。
ALTER TABLE 语句与 FOREIGN KEY 约束“FK_BookedResourcesMemberId_MembersMemberId”冲突。冲突发生在数据库“resursBokning2”、表“dbo.Members”、列“MemberId”中。

MemberId中的MemberId就是PK。

BookedResouce.EditedBy (FK) -> Member.MemberId (PK)
BookedResouce.MemberId (FK) -> Member.MemberId (PK)

有人知道这个错误是关于什么的吗? 我读到过这种关系应该没问题,所以它应该有效。

【问题讨论】:

    标签: sql sql-server table-relationships


    【解决方案1】:

    根据您提供的错误,您似乎尝试将两个外键命名为相同。正如@kinse 建议的那样,给每个外键关系一个唯一的名称。此外,请考虑您是否需要同一个表的两个外键 - 这可能表明您的数据库模型不完整。

    我假设 Members 不会编辑其他成员,因此在 members 表中 EditedBy(成员)和 MemberId 似乎是不必要的。

    【讨论】:

      【解决方案2】:

      出现错误是因为您可能两次使用相同的外键名称,因此将第二个名称更改为其他值,例如:

      FK_BookedResourcesMemberId_MembersMemberId2
      

      【讨论】:

      • 当然也可以是最初在BookedResource表中创建记录的成员存储在MemberId中。在这种情况下,您没有重复的数据。
      • 没错,一个成员可以创建,另一个成员可以编辑。如果你看一下 im Writing,一个 fk 叫做 EditedBy,另一个 fk MemberId。
      • @david2342 kinske 不是指相关列的名称,而是指 FK 的名称。您的警告表明两者都称为FK_BookedResourcesMemberId_MembersMemberId 可能是您不小心尝试添加相同的列关系两次,您应该仔细检查这些。
      • 好的。第一个看起来像 ALTER TABLE [dbo].[BookedResources] WITH CHECK ADD CONSTRAINT [FK_BookedResourcesEditedBy_BookedResourcesMemberId] FOREIGN KEY([EditedBy]) REFERENCES [dbo].[Members] ([MemberId]) 我试图添加的另一个被称为FK_BookedResourcesMemberId_MembersMemberId
      • @david2342:好的。现在我明白你想要做什么了。也许你不使用“WITH CHECK”就试试吧
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多