Условно применять уникальный индекс - PullRequest
0 голосов
/ 19 июня 2019

Я реализую функциональность для таблицы, которая при внесении изменений / изменений сохранит копию строки предварительного редактирования и пометит ее как is_deleted = TRUE, это для создания истории изменений, внесенных в строку.

Столбец электронной почты в таблице имеет уникальный индекс, который препятствует успешной работе этой функции.

PostgreSQL said: duplicate key value violates unique constraint "users_email_unique"
Detail: Key (email)=(TEST) already exists.

Можно ли применить уникальный индекс только к отмеченным строкамis_deleted = FALSE, что позволяет вносить изменения.

1 Ответ

3 голосов
/ 19 июня 2019

Начиная с версии 7.2, вы можете использовать частичные индексы в PostgreSql

Добавить предложение where в оператор create index, чтобы сделать его частичным индексом:

CREATE UNIQUE INDEX users_email_unique ON tests (email)
WHERE NOT is_deleted; -- assuming is_deleted is Boolean

Хотя PostgreSql поддерживает Alter index, насколько я понимаю из документации, изменение ограничивается либо переименованием, либо настройкой табличного пространства.

Это означает, что вам потребуется отбросить и заново создать индекс, чтобы превратить его в частичный индекс:

DROP INDEX users_email_unique;

CREATE UNIQUE INDEX users_email_unique ON tests (email)
WHERE NOT is_deleted; -- assuming is_deleted is Boolean
...