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_id
和variant_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的最新相关答案,几乎直接适用于您的案例: