这是我的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
无法创建约束。查看以前的错误。]
答案 0 :(得分:1)
您的主键是{ShiftId,ShiftCode}。
对该表的任何外键引用都必须引用这两列。
所以你需要做三件事之一。
实际上还有很多方法可以解决这个问题,但我认为它们会导致比解决问题更多的问题。
答案 1 :(得分:0)
您确定要Kbr_ShiftMaster
拥有两列主键吗?这意味着ShiftID
和ShiftCode
的组合是唯一的,而不是任何一列。
如果您希望ShiftID
是唯一的并且还希望ShiftCode
是唯一的,则其中一个需要是主键,另一个需要具有唯一约束。
如果您希望ShiftAssginMaster
引用ShiftCode
,则ShiftCode
将需要是主键,因为只有主键可以在外键中引用。
这提出了为什么你需要ShiftID
的问题。您的ShiftCode
是所谓的语义键,意味着该值具有意义并且不是任意分配的,但通常认为更好的做法是不将语义键作为主键。
这是一个原因。如果您在使用ShiftCode
时需要更改ShiftCode
,并且ShiftCode
是主键,那么在所有其他具有引用该记录的记录的表中,您将遇到很多问题记录。然而,如果ShiftID
只是用于显示和数据输入的移位的属性而不是主键,那么纠正其值将是微不足道的。
因此,如果由我决定,我会将ShiftAssignMaster
标准化为您的主键,并在其外键中引用{{1}}。