Нет замечательного способа сделать это. Не существует концепции применения внешних ключей с некоторыми дополнительными условиями. Вот три варианта, которые мне приходят на ум:
Отдельные таблицы
Вероятно, самый простой способ выполнить эту спецификацию c цель - просто создать две таблицы - один с Одобренными Автомобилями и один с остальными.
Первичный ключ ApprovedCars
будет (Manufacturer,Model)
, и тогда вы можете просто создать внешний ключ для этой таблицы.
Существует Тем не менее, существует некоторая вероятность возникновения аномалий при таком подходе - например, Manufacturer,Model
в обеих таблицах. И это усложнит запросы, требующие доступа ко всему набору автомобилей.
Индексированное представление
Вы хотите утверждать, что приведенный ниже запрос всегда не возвращает строк
SELECT C.Manufacturer, C.Model
FROM Car C
JOIN Dealership D
ON C.Manufacturer = D.Manufacturer
AND C.Model = D.Model
WHERE ApprovalStatus IS NULL OR ApprovalStatus <> 'Approved'
Вы можете создать вспомогательную таблицу с двумя строками и перекрестным соединением, чтобы умножить любые нарушения, а затем поместить весь лот в индексированное представление с уникальным ограничением на него ( подробный пример ).
Шаблон Supertype / Subtype
Я предполагаю, что ваш существующий PK на Car
равен (Manufacturer,Model)
.
Вы можете добавить логически избыточное дополнительное уникальное ограничение на (Manufacturer,Model,ApprovalStatus)
, затем добавить ApprovalStatus
в таблицу Dealership
с проверочным ограничением, которое должно равняться «Одобрено» и иметь внешний ключ, ссылающийся на все три столбца.