Создание уникального ограничения для столбца с условием уникальности

#sql #postgresql #unique-constraint #unique-index

#sql #postgresql #уникальный-ограничение #уникальный-индекс

Вопрос:

Допустим, у меня есть таблица, содержащая 3 столбца:

 CREATE TABLE some_table(
    id BIGSERIAL PRIMARY KEY,
    name text NOT NULL,
    some_boolean boolean DEFAULT TRUE
);
 

Я хочу создать уникальное ограничение для столбца ‘name’, но оно должно быть уникальным только из всех имеющихся some_boolean = true . например, если у меня есть вызываемая запись с именем banana some_boolean as false , я могу создать другую, также вызываемую banana .

Более конкретно: в моей таблице есть expiration_date столбец, мне нужно, чтобы имена были уникальными для всех объектов с истекшим сроком действия

Комментарии:

1. Найдите отфильтрованный уникальный индекс .

Ответ №1:

Вы можете создать уникальный индекс фильтрации следующим образом:

 create unique index idx_some_table_uniq_name 
    on some_table(name) 
    where (some_boolean);
 

Или, если вы хотите отфильтровать строки expiration_date , где null :

 create unique index idx_some_table_uniq_name 
    on some_table(name) 
    where (expiration_date is null);
 

Ответ №2:

Ограничение условной уникальности может быть достигнуто с помощью условного уникального индекса следующим образом:

 CREATE UNIQUE INDEX some_table_Unq ON some_table (name) WHERE (some_boolean = TRUE);
 

db<>скрипка

Вы можете заменить some_boolean = TRUE на some_boolean и в вашем случае на expiration_date is null