#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);
Вы можете заменить some_boolean = TRUE
на some_boolean
и в вашем случае на expiration_date is null