Может ли внешний ключ в таблице быть тремя разными таблицами в качестве первичных ключей (данные первичного ключа каждой таблицы различны)? - PullRequest
1 голос
/ 03 марта 2020

У меня есть таблица напоминаний (ParentId) - внешний ключ для ProductId из Product, а также OrderId из таблицы Order. Является ли это возможным? Когда я пытаюсь вставить данные для таблицы напоминаний, принадлежащих OrderId, я получаю ошибку ограничения внешнего ключа.

Reminder
 - ReminderId
 - ParentId

Product
 - ProductId

Order
 - OrderId

ALTER TABLE [dbo].[Reminder]  WITH NOCHECK ADD  CONSTRAINT [FK_Reminder_ProductId] FOREIGN KEY([ParentId])

REFERENCES [dbo].[Product] ([ProductId])
GO

ALTER TABLE [dbo].[Reminder] NOCHECK CONSTRAINT [FK_Reminder_ProductId]
GO

ALTER TABLE [dbo].[Reminder]  WITH NOCHECK ADD  CONSTRAINT [FK_Reminder_OrderId] FOREIGN KEY([ParentId])
REFERENCES [dbo].[Quote] ([QuoteId])
GO

ALTER TABLE [dbo].[Reminder] NOCHECK CONSTRAINT [FK_Reminder_OrderId]
GO

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Вы можете сделать это с небольшим количеством работы, используя отношения внешнего ключа и вычисленные столбцы. Для этого требуется какой-то «тип» в таблице:

create table reminders (
    ReminderId . . . primary key,
    parentId int, -- presumably
    type varchar(255),
    check (type in ('product', 'order')),
    parent_productid as (case when type = 'product' then parentId end) persisted,
    parent_orderid as (case when type = 'order' then parentId end) persisted,
    foreign key (parent_productid) references products(productId),
    foreign key (parent_orderid) references orders(orderid)
);

Здесь - это db <> скрипка.

0 голосов
/ 03 марта 2020

Если я понимаю ваш вопрос, то Нет, это невозможно в любой известной мне базе данных SQL.

Я считаю, что вы хотите указать, что значение в ParentId должно присутствовать в либо таблица Product (поле ProductId), либо таблица Quote (поле QuoteId). Это не разрешено в отношениях Первичный / Внешний ключ - вы можете указать Внешний ключ и один, и только один, Первичный ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...