我正在实现一个表的功能,当进行编辑/更改时,它将保存预编辑行的副本并将其标记为is_deleted = TRUE,这是为了创建对行进行更改的历史记录
表中的电子邮件列具有唯一索引,这阻止了此功能的成功。
PostgreSQL said: duplicate key value violates unique constraint "users_email_unique"
Detail: Key (email)=(TEST) already exists.
有没有一种方法可以将唯一索引仅应用于标记为is_deleted = FALSE的行,从而允许进行更改。
答案 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