Уникальное ограничение с нулевым значением, интерпретируемым как любое значение - PullRequest
0 голосов
/ 26 октября 2018

Рассмотрим таблицу

CREATE TABLE foo
(
    id uuid NOT NULL DEFAULT uuid_generate_v4(),
    col1 integer NOT NULL,
    col2 integer NOT NULL,
    col3 integer
)

Мне нужно проверить уникальность на (col1, col2, col3), с NULL в col3, означающим любое значение. То есть, если в таблице есть строка (1, 2, NULL), будет невозможно вставить строку с col1 = 1, col2 = 2 и любым значением в col3 (включая NULL). И наоборот, если в таблице есть хотя бы одна строка с col1 = 1 и col2 = 2 и некоторое значение не NULL в col3, вы не можете вставить строку (1, 2, NULL), но строку с col1 = 1, col2 = 2 и любое значение в col3 (кроме NULL) будет действительным.

Например, эти значения действительны (первый столбец идентификатора опущен):

(1, 2, 3)
(1, 2, 4)
(1, 2, 5)

или

(1, 2, NULL)
(1, 3, NULL)

Но эти значения недействительны:

(1, 2, NULL)
(1, 2, 3)
(1, 2, 4)

или

(1, 2, NULL)
(1, 2, NULL)
(1, 2, 3)
(1, 2, 4)

Могу ли я сделать это с помощью PostgreSQL? Я использую версию 9.6.5.

1 Ответ

0 голосов
/ 26 октября 2018

Перед вставкой проверьте, есть ли строка с:

col1=your_col1_value 
col2=your_col2_value
col3=null 

, если это не так, не вставляйте вашу строку.

Используйте выбор вставки: https://www.postgresql.org/docs/current/static/sql-insert.html

А не существует: https://www.postgresql.org/docs/current/static/functions-subquery.html

...