Могут ли ограничения FK работать на нескольких таблицах? - PullRequest
1 голос
/ 08 октября 2011

У меня есть таблица с именем Order.Он имеет FK для таблицы с именем OrderSource, которая имеет неуникальный идентификатор в SourceId.Order также имеет FK для таблицы с именем OrderType (каталог того, что можно заказать).У него есть PK OrderTypeId.

Затем у меня есть другая таблица (Order_OrderSource), которая ограничивает виды SourceIds, которые я могу иметь для данного OrderTypeId.(Он содержит строки OrderTypeId, SourceId и ClassId (еще один Id, который используется для группировки определенного источника и OrderTypes вместе).

Я хотел бы, чтобы база данных обеспечивала, чтобы у Order не было OrderSource.SourceIdесли его OrderTypeId не совпадает в таблице Order_OrderSource.

Это своего рода ассоциативный шаблон таблицы, но он не работает, поскольку SourceId не является PK OrderSource.

В любом случаеЯ могу заставить SQL Server применять это ограничение?

Ответы [ 2 ]

2 голосов
/ 08 октября 2011

Да, один столбец может быть частью нескольких ограничений внешнего ключа для разных таблиц.

Для внешнего ключа требуется уникальный индекс (или первичный ключ) для столбцов, на которые вы ссылаетесь. В вашем случае вы могли бы удовлетворить это требование с помощью составного первичного ключа на Order_OrderSource.(OrderSource,OrderType).

Пример SQL:

create table OrderSource (id int primary key)
create table OrderType (id int primary key)
create table Order_OrderSource (OrderSource int, OrderType int, 
    constraint PK_Order_OrderSource primary key (OrderSource,OrderType))
create table [Order] (
    id int, 
    OrderSource int foreign key references OrderSource(id), 
    OrderType int foreign key references OrderType(id), 
    constraint FK_Order_OrderSource 
        foreign key (OrderSource,OrderType) 
        references Order_OrderSource (OrderSource,OrderType))

Комбинация (OrderSource, OrderType) теперь ограничена строками в Order_OrderSource.

0 голосов
/ 08 октября 2011

Похоже, Order_OrderSource определяет допустимые отношения между OrderType, OrderSource и Class?И Order классифицируется по OrderType, OrderSource и (возможно) классу?

Если это так, почему бы не определить допустимые комбинации в Order_OrderSource и создать FK для Order, который относится к этой таблице?Тогда вам не нужно указывать SourceId или OrderTypeId для Order, и вы получаете полное применение через ограничения FK.

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