Два столбца являются уникальными, если другой столбец равен нулю - PullRequest
0 голосов
/ 23 декабря 2018

[Oracle SQL]

Можно ли создать уникальное ограничение для двух столбцов (id1, id2), если другой столбец (id3) был нулевым?

ALTER TABLE t ADD CONSTRAINT u_t UNIQUE (id1, id2);

Если нет, то каким образом я могу решить эту проблему?

Спасибо,

1 Ответ

0 голосов
/ 23 декабря 2018

Вы можете использовать уникальный индекс на основе функции.В CASE возвращает GUID, когда id3 равно нулю.Если он не возвращает действительное значение id1 или id2, соответственно.

Единственная проблема заключается в том, что типы в ветвях CASE должны быть совместимы.Вот почему я конвертирую их в символы здесь.Возможно, вы можете сделать это по-разному, в зависимости от типа данных id1 и id2.

CREATE UNIQUE INDEX i_t_id3_nn_id1_id2
                    ON t
                       (CASE
                          WHEN id3 IS NULL THEN
                            to_char(id1)
                          ELSE
                            rawtohex(sys_guid())
                        END,
                        CASE
                           WHEN id3 IS NULL THEN
                             to_char(id2)
                           ELSE
                             rawtohex(sys_guid())
                        END);

db <> fiddle ;

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

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