【问题标题】:Creating a foreign key to compound primary key创建复合主键的外键
【发布时间】:2017-08-20 12:26:26
【问题描述】:

我有两张桌子 - EducatorsFaculties

CREATE TABLE [dbo].[Educators]
(
    [UserId] [nvarchar](128) NOT NULL,
    [FacultyId] [smallint] NOT NULL,
    [InstitutionUserId] [nvarchar](128) NOT NULL,

    CONSTRAINT [PK_Educators] 
        PRIMARY KEY CLUSTERED ([UserId] ASC)
)

CREATE TABLE [dbo].[Faculties]
(
    [InstitutionUserId] [nvarchar](128) NOT NULL,
    [FacultyId] [smallint] NOT NULL,

    CONSTRAINT [PK_UserFaculties] 
        PRIMARY KEY CLUSTERED ([InstitutionUserId] ASC, [FacultyId] ASC)
)

Faculties 有一个由两列(InstitutionUserIdFacultyId)组成的复合主键。我在Educators 表中也有相同的列。我想用外键将这两个表链接在一起。

所以,这是我的查询:

ALTER TABLE [dbo].[Educators] WITH CHECK 
    ADD CONSTRAINT [FK_Educators_FacultyId_Faculties_FacultyId] 
    FOREIGN KEY ([FacultyId], [InstitutionUserId])
    REFERENCES [dbo].[Faculties] ([FacultyId], [InstitutionUserId])

但我收到此错误消息:

消息 1776,第 16 级,状态 0,第 7 行
引用表 'dbo.Faculties' 中没有与外键 'FK_Educators_FacultyId_Faculties_FacultyId' 中的引用列列表匹配的主键或候选键。

消息 1750,第 16 级,状态 1,第 7 行
无法创建约束或索引。查看以前的错误。

如何解决这个问题?

【问题讨论】:

    标签: sql sql-server database tsql azure-sql-server


    【解决方案1】:

    您的表格及其约束看起来不错。我能看到的唯一问题是主键中列的顺序

    CONSTRAINT [PK_UserFaculties] PRIMARY KEY CLUSTERED 
    (
        [InstitutionUserId] ASC,
        [FacultyId] ASC
    )
    

    与您在外键约束中声明的顺序不同

    ALTER TABLE [dbo].[Educators]  WITH CHECK ADD  CONSTRAINT [FK_Educators_FacultyId_Faculties_FacultyId] FOREIGN KEY([FacultyId], [InstitutionUserId])
    REFERENCES [dbo].[Faculties] ([FacultyId], [InstitutionUserId])
    

    尝试更改外键声明中列的顺序,如下所示:

    ALTER TABLE [dbo].[Educators]  WITH CHECK ADD  CONSTRAINT [FK_Educators_FacultyId_Faculties_FacultyId] FOREIGN KEY([InstitutionUserId], [FacultyId])
    REFERENCES [dbo].[Faculties] ([InstitutionUserId], [FacultyId])
    

    【讨论】:

      【解决方案2】:

      键的顺序应与定义的顺序相同:

      ALTER TABLE dbo.Educators
          ADD CONSTRAINT FK_Educators_FacultyId_Faculties_FacultyId
              FOREIGN KEY(InstitutionUserId, FacultyId)
                  REFERENCES dbo.Faculties(InstitutionUserId, FacultyId);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        • 2018-04-07
        • 1970-01-01
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        • 2021-04-10
        相关资源
        最近更新 更多