В колонках [1, 2, 3, ...] сделать УНИКАЛЬНЫМ между [(1, 2), (1, 3), (1, 4), ...]
В основном название.
Что будет считаться лучше:
- n-1 УНИКАЛЬНЫЕ пары между всеми (1, k) столбцами
- Некоторые триггеры, которые в основном делают то же, что и выше, но опять же - как это сделать без тонны кода.
- Другой неизвестный мне короткий путь - пожалуйста, укажите мне правильное направление.
Как сделать пример из этого:
Скажем, есть продукт, который имеет много атрибутов. Мы хотим, чтобы все столбцы в Атрибуте были уникальными для Продукта, например:
Product
ID Name
1 Something
2 Other
Attribute
ID ProductID Name Code Alias1 Alias2
1 1 One O 1 |
2 1 Two T 2 ||
3 1 Three T 3 |||
4 2 Two T 2 ||
Таким образом, атрибут с ID=4 проходит, потому что он уникален во всех столбцах для ProductID=2. Атрибут ID=3 потерпит неудачу, потому что он повторяет код =T, уже используемый ID = 2.
2 ответа
Похоже, вы хотите отдельное уникальное ограничение для каждой пары столбцов с productid
:
create unique index unq_product_productid_name on product(productid, name);
create unique index unq_product_productid_code on product(productid, code);
create unique index unq_product_productid_alias1 on product(productid, alias1);
create unique index unq_product_productid_alias1 on product(productid, alias2);
Вы можете реализовать это с помощью триггера. Однако определение уникальности будет довольно дорогим, если у вас нет индекса для каждой пары столбцов. Таким образом, для производительности вы хотели бы те же индексы.
Наличие этих индексов связано с накладными расходами, особенно на операции модификации данных. Если вы делаете это очень редко, тогда триггер без индексов может быть в порядке.
В целом, однако, я бы выбрал отдельные уникальные индексы для каждой пары, потому что это является целью ваших проверок целостности данных. Начните с кода, который четко выражает ваши намерения. Позже вы можете работать над альтернативными решениями, если производительность является проблемой.
Вы могли бы добавить UNIQUE
индекс по обоим столбцам:
CREATE INDEX UQ_tab ON tab_name(ProductId, Code);
-- before you do that you need to clean initial data