有条件地应用唯一索引

时间:2019-06-19 06:59:51

标签: sql database postgresql psql unique-index

我正在实现一个表的功能,当进行编辑/更改时,它将保存预编辑行的副本并将其标记为is_deleted = TRUE,这是为了创建对行进行更改的历史记录

表中的电子邮件列具有唯一索引,这阻止了此功能的成功。

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

有没有一种方法可以将唯一索引仅应用于标记为is_deleted = FALSE的行,从而允许进行更改。

1 个答案:

答案 0 :(得分:3)

从7.2版开始,您可以在PostgreSql中使用partial indexes

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并重新创建索引才能将其更改为部分索引:

DROP INDEX users_email_unique;

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