В колонках [1, 2, 3, ...] сделать УНИКАЛЬНЫМ между [(1, 2), (1, 3), (1, 4), ...]

В основном название.

Что будет считаться лучше:

  1. n-1 УНИКАЛЬНЫЕ пары между всеми (1, k) столбцами
  2. Некоторые триггеры, которые в основном делают то же, что и выше, но опять же - как это сделать без тонны кода.
  3. Другой неизвестный мне короткий путь - пожалуйста, укажите мне правильное направление.

Как сделать пример из этого:

Скажем, есть продукт, который имеет много атрибутов. Мы хотим, чтобы все столбцы в Атрибуте были уникальными для Продукта, например:

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
Другие вопросы по тегам