将外键添加到组合键时出错

Han*_*ady 2 sql-server foreign-keys composite-key

我在sql server中有两个表:

第一个表Message_Child有一个复合主键(MessageId,ChildId)

Message_Child (MessageId, ChildId, Date)
Run Code Online (Sandbox Code Playgroud)

第二个表应该包含表的外键Message_Child,所以我创建了两列:MessageId和ChildId.

Request (RequestId, MessageId, ChildId, type)
Run Code Online (Sandbox Code Playgroud)

我创建了约束如下:

Alter table Request
ADD FOREIGN KEY (MessageId, ChildId) REFERENCES Message_Child(MessageId, ChildId);
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

引用的表'Message_Child'中没有主键或候选键与外键'FK_ Request _534D60F1' 中的引用列列表匹配.

编辑 添加代码:

Message_Child表:

CREATE TABLE [dbo].[Message_Child](
[ChildId] [int] NOT NULL,
[MessageId] [int] NOT NULL,
[Date] [datetime] NULL,
 CONSTRAINT [PK_Message_Child] PRIMARY KEY CLUSTERED 
(
[ChildId] ASC,
[MessageId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,      ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Message_Child]  WITH CHECK ADD  CONSTRAINT          [FK_Message_Child_Child_ChildId] FOREIGN KEY([ChildId])
REFERENCES [dbo].[Child] ([ChildId])
GO

ALTER TABLE [dbo].[Message_Child] CHECK CONSTRAINT [FK_Message_Child_Child_ChildId]
GO

ALTER TABLE [dbo].[Message_Child]  WITH CHECK ADD  CONSTRAINT     [FK_Message_Child_Message_MessageId] FOREIGN KEY([MessageId])
REFERENCES [dbo].[Message] ([MessageId])
GO

ALTER TABLE [dbo].[Message_Child] CHECK CONSTRAINT [FK_Message_Child_Message_MessageId]
GO
Run Code Online (Sandbox Code Playgroud)

RequestQueue表:

CREATE TABLE [dbo].[RequestQueue](
[RequestQueueId] [int] IDENTITY(1,1) NOT NULL,
[PIN] [nvarchar](max) NULL,
[MessageId] [int] NULL,
[ChildId] [int] NULL,
 CONSTRAINT [PK_RequestQueue] PRIMARY KEY CLUSTERED 
(
[RequestQueueId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,   ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[RequestQueue]  WITH CHECK ADD  CONSTRAINT   [FK_RequestQueue_MessageChildId] FOREIGN KEY([RequestQueueId])
REFERENCES [dbo].[RequestQueue] ([RequestQueueId])
GO

ALTER TABLE [dbo].[RequestQueue] CHECK CONSTRAINT [FK_RequestQueue_MessageChildId]
GO
Run Code Online (Sandbox Code Playgroud)

然后我添加了这个:

Alter table [DayCareDB].[dbo].[RequestQueue]
ADD FOREIGN KEY (MessageId, ChildId) REFERENCES [DayCareDB].[dbo].[Message_Child](MessageId, ChildId);
Run Code Online (Sandbox Code Playgroud)

JNK*_*JNK 5

关键顺序在这里很重要 您需要使用(ChildID, MessageID) IN THAT ORDER,因为这是主键定义中的关键顺序.

Alter table [DayCareDB].[dbo].[RequestQueue]
ADD FOREIGN KEY (ChildId, MessageId) 
REFERENCES [DayCareDB].[dbo].[Message_Child](ChildId, MessageId);
Run Code Online (Sandbox Code Playgroud)