向唯一约束添加条件

kic*_*ken 5 postgresql

我目前对表有以下约束:

ALTER TABLE myTable
            ADD CONSTRAINT unique_row UNIQUE (content_id, brand_id, language_id);
Run Code Online (Sandbox Code Playgroud)

我想向约束添加一个条件:我希望约束以相同的方式工作,但只有一行 is_archived 为 FALSE:

ALTER TABLE myTable
         ADD CONSTRAINT unique_row UNIQUE (content_id, brand_id, language_id, !is_archived);
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我收到语法错误。

如果则允许is_archived = true具有相同的content_id和组合的多行。brand_id基本上可以归档多行相同的行,但只能取消归档一行。

Col*_*art 9

虽然 Postgres 不允许部分唯一约束,但它确实支持部分唯一索引:

create unique index unique_row on myTable(content_id, brand_id) where not is_archived;
Run Code Online (Sandbox Code Playgroud)

请参阅Postgres 文档中的部分索引。

这实际上与唯一约束几乎相同,因为无论如何,此类约束都是通过唯一索引实现的。

  • @AlexDvoretsky 你可以!您必须在“onconflict”子句中的列后面指定与部分索引相同的“where”。例如“...在冲突(content_id,brand_id)上,如果不是 is_archived 则更新...” (3认同)