引用表中没有主键或候选键" table1'与外键中的引用列列表匹配

时间:2015-02-18 11:32:26

标签: sql-server-2008

这是我的table1

CREATE TABLE [dbo].[Kbr_ShiftMaster]
(
    [ShiftId] [int] IDENTITY(1,1) NOT NULL,
    [ShiftCode] [nvarchar](50) NULL,
    [ShiftName] [nvarchar](100) NULL,
    [ShiftStartTime] [nvarchar](10) NULL,
    [ShiftStartBreak] [nvarchar](10) NULL,
    [ShiftEndBreak] [nvarchar](10) NULL,
    [ShiftEndTime] [nvarchar](10) NULL,
    [CreatedBy] [int] NOT NULL,
    [CreateDate] [datetime] NULL,
    [ModifiedBy] [datetime] NULL,
    [ModifyDate] [datetime] NULL,
    [Active] [nvarchar](50) NULL,
    [Remarks] [nvarchar](500) NULL
)

我正在为此表添加主键。

ALTER TABLE Kbr_ShiftMaster 
 ADD PRIMARY KEY(ShiftId, ShiftCode);

我现在有表2,其中我添加了两个外键

CREATE TABLE ShiftAssginMaster
(
    SAMID INT IDENTITY(1,1),
    EmpId INT,
    ShiftCode NVARCHAR(50) NOT NULL,
    STARTDATE DATETIME NOT NULL,
    ENDDATE DATETIME NOT NULL,
    [CreatedBy] [int] NOT NULL,
    [CreateDate] [datetime] NULL,
    [ModifiedBy] [datetime] NULL,
    [ModifyDate] [datetime] NULL,

    FOREIGN  KEY(EmpId) REFERENCES kbr_Emp(EmpId),
    FOREIGN  KEY(ShiftCode) REFERENCES Kbr_ShiftMaster(ShiftCode)
);

执行此查询时,我收到此错误

  

Msg 1776,Level 16,State 0,Line 2
  引用表'Kbr_ShiftMaster'中没有主键或候选键与外键'FK__ShiftAssg__Shift__4FBCC72F'中的引用列列表匹配。

     

Msg 1750,Level 16,State 0,Line 2
  无法创建约束。查看以前的错误。]

2 个答案:

答案 0 :(得分:1)

您的主键是{ShiftId,ShiftCode}。

对该表的任何外键引用都必须引用这两列

所以你需要做三件事之一。

  • 添加列" ShiftId"到桌子" ShiftAssginMaster"。
  • 添加一个有效班次代码表,并创建的外键引用而不是" Kbr_ShiftMaster"。
  • 放弃。

实际上还有很多方法可以解决这个问题,但我认为它们会导致比解决问题更多的问题。

答案 1 :(得分:0)

您确定要Kbr_ShiftMaster拥有两列主键吗?这意味着ShiftIDShiftCode的组合是唯一的,而不是任何一列。

如果您希望ShiftID是唯一的并且还希望ShiftCode是唯一的,则其中一个需要是主键,另一个需要具有唯一约束。

如果您希望ShiftAssginMaster引用ShiftCode,则ShiftCode将需要是主键,因为只有主键可以在外键中引用。

这提出了为什么你需要ShiftID的问题。您的ShiftCode是所谓的语义键,意味着该值具有意义并且不是任意分配的,但通常认为更好的做法是不将语义键作为主键。

这是一个原因。如果您在使用ShiftCode时需要更改ShiftCode,并且ShiftCode是主键,那么在所有其他具有引用该记录的记录的表中,您将遇到很多问题记录。然而,如果ShiftID只是用于显示和数据输入的移位的属性而不是主键,那么纠正其值将是微不足道的。

因此,如果由我决定,我会将ShiftAssignMaster标准化为您的主键,并在其外键中引用{{1}}。