2014-01-29 2 views
2

У меня есть два стола в SQL Server:Ошибка при добавлении внешнего ключа к составному ключу

Первая таблица Message_Child имеет составной первичный ключ (MESSAGEID, ChildId)

Message_Child (MessageId, ChildId, Date) 

Вторая таблица должен содержать внешний ключ к таблице Message_Child, поэтому я создал две колонки: MessageId и ChildId.

Request (RequestId, MessageId, ChildId, type) 

И я создал ограничение следующим образом:

Alter table Request 
ADD FOREIGN KEY (MessageId, ChildId) REFERENCES Message_Child(MessageId, ChildId); 

Но я получаю следующее сообщение об ошибке:

Там нет первичных или кандидатов ключи в указанной таблице «Message_Child» которые соответствуют списку столбцов ссылок во внешнем ключе 'FK_ Запрос _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 

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 

А потом я добавил это:

Alter table [DayCareDB].[dbo].[RequestQueue] 
ADD FOREIGN KEY (MessageId, ChildId) REFERENCES [DayCareDB].[dbo].[Message_Child](MessageId, ChildId); 
+0

Ошибка довольно сам пояснительный. У вас не может быть 2-х столбчатого внешнего ключа, ссылающегося на 3-х столбчатый составной первичный ключ. – Kermit

+0

Нет составного ключа, состоящего из двух столбцов. См. Вторую строку. Дата не находится в составном ключе. – Hanady

+0

Опасайтесь, неправильно запишите свою структуру таблицы как свой ключ. – Kermit

ответ

5

Основные вопросы здесь. Вы должны использовать (ChildID, MessageID)В ЧЕМ ЗАКАЗ, так как это ключевой порядок в определении вашего первичного ключа.

Alter table [DayCareDB].[dbo].[RequestQueue] 
ADD FOREIGN KEY (ChildId, MessageId) 
REFERENCES [DayCareDB].[dbo].[Message_Child](ChildId, MessageId); 
Смежные вопросы