如何在PostgreSQL上添加条件唯一索引

Nic*_*ilt 10 postgresql indexing null

我有一个line_items包含以下列的表:

product_id
variant_id
Run Code Online (Sandbox Code Playgroud)

variant_id 是可以为空的.

这是条件:

  • 如果variant_id为NULL则product_id应该是唯一的.
  • 如果variant_id有一个值,则组合product_idvariant_id应该是唯一的.

这可能在PostgreSQL中吗?

Erw*_*ter 28

创建一个UNIQUE多列索引(product_id, variant_id):

CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
Run Code Online (Sandbox Code Playgroud)

但是,这将允许(1, NULL)for的多个条目,(product_id, variant_id)因为NULL值不被视为相同.
为了弥补的是,另外创建一个局部UNIQUE指数product_id:

CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;
Run Code Online (Sandbox Code Playgroud)

这样,您就可以进入(1,2),(1,3)并且(1, NULL),但是他们都没有第二次.还可以加快一列或两列条件的查询速度.

关于dba.SE的最新相关答案,几乎直接适用于您的案例: