Ограничение составного уникального ключа с несколькими значениями NULL в одном столбце - PullRequest
0 голосов
/ 21 января 2019

У меня есть уникальный ключ в таблице x с 3 столбцами (a, b, c), где a, b, c - внешние ключи, а c может быть нулевым в таблице x.

a b c
- - ----
1 1    1
1 1    2
1 1 NULL
1 1 NUll

Вышеупомянутые строки действительны в MySQL, и вставка строк с несколькими значениями NULL не нарушает ограничения. Но это не так с Oracle, SQL-Server

Каковы лучшие практики в этом сценарии?

с каждым уникальным ограничением создается уникальный индекс, и если я отключаю уникальный индекс, в SQL-сервере также допускаются несколько нулей (с отфильтрованным индексом)

Мне нужно установить множественное значение в столбце c с нулевым внешним ключом.

Пожалуйста, предложите мне удалить ограничение уникального ключа или удалить внешний ключ из столбца c таблицы x. или у нас есть другое решение.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

В SQL Server вы можете использовать отфильтрованный индекс:

create index unq_t_a_b_c on t(a, b, c)
    where c is not null;

Это также должно работать с базами данных на основе Postgres и Postgres.

Oracle не поддерживает отфильтрованные индексы.Вы можете использовать вычисляемые столбцы для этой цели - при условии, что у вас есть первичный ключ:

create index unq_t_a_b_c on t(a, b, c, (case when c is null then pk end));

Это позволит использовать несколько значений, когда c равно нулю.

0 голосов
/ 21 января 2019

Этот индекс делает то, что вы хотите:

create unique index idx_t_abc on t(
  case when c is not null then a end,
  case when c is not null then b end, 
  case when c is not null then c end);

Проверено только в Oracle.Аналогичный вопрос на сайте asktom: уникальный индекс с нулевыми значениями .

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