Проверьте заданное значение c в другой таблице как ограничение - PullRequest
0 голосов
/ 03 мая 2020

У меня есть две таблицы следующим образом.

Table Car

Manufacturer    Model    ApprovalStatus
Toyota          SE       Approved
Toyota          C-HR     Testing
Prius           XLE      Approved
Hyundai         NEXO     Testing

Таблица дилеров

ParkingSpace    Manufacturer    Model
F1              Toyota          SE
F2              Toyota          SE
F3              Toyota          C-HR 
...             ...             ...

Я хочу добавить ограничение на добавление данных в дилерский центр таблица на основе производителя и модели. Только производители и модели с утвержденным статусом должны быть добавлены в таблицу дилеров. Если пользователь пытается ввести существующую модель и производителя со статусом, который не утвержден, он не должен позволять им.

Как проверить значение ApprovalStatus на основе внешнего ключа Manufacturer и Model и добавить это как ограничение.

1 Ответ

1 голос
/ 03 мая 2020

Нет замечательного способа сделать это. Не существует концепции применения внешних ключей с некоторыми дополнительными условиями. Вот три варианта, которые мне приходят на ум:

Отдельные таблицы

Вероятно, самый простой способ выполнить эту спецификацию 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 с проверочным ограничением, которое должно равняться «Одобрено» и иметь внешний ключ, ссылающийся на все три столбца.

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