колонка deleted и есть другая таблица у которой есть внешний ключь на id первой талицы и колонка name с уникальным индексом
Суть в том, что хотелось чтобы name проверялось на уникальность, только если в таблице 1 deleted = false
Есть варианты, как это реализовать?
Только триггером. И будет говно.
regression=# create table hehehe ( id bigserial, name varchar, deleted int default 0 ); CREATE TABLE regression=# create unique index hehehe_name_idx on hehehe ( name ) where ( deleted = 0 ); CREATE INDEX regression=# insert into hehehe ( name ) values ( 'name1' ); INSERT 0 1 regression=# insert into hehehe ( name ) values ( 'name2' ); INSERT 0 1 regression=# insert into hehehe ( name ) values ( 'name3' ); INSERT 0 1 regression=# insert into hehehe ( name ) values ( 'name1' ); ERROR: duplicate key value violates unique constraint "hehehe_name_idx" DETAIL: Key (name)=(name1) already exists. regression=# update hehehe set deleted = 1 where name = 'name1'; UPDATE 1 regression=# insert into hehehe ( name ) values ( 'name1' ); INSERT 0 1 regression=# select * from hehehe; id | name | deleted ----+-------+--------- 2 | name2 | 0 3 | name3 | 0 1 | name1 | 1 5 | name1 | 0 (4 rows)
https://postgrespro.ru/docs/postgresql/12/indexes-partial И денормализовать предварительно. Либо выкинуть лишнюю таблицу совсем, либо поле продублировать.
Обсуждают сегодня