2012-01-18 73 views

回答

20

创建UNIQUE multicolumn INDEX(product_id, variant_id)

CREATE UNIQUE INDEX line_items_prod_id_var_id_idx 
ON line_items (product_id, variant_id); 

然而,这将允许(1, NULL)多个条目(product_id, variant_id)因为NULL值不被认为是相同的。
为了弥补的是,另外创建一个partial UNIQUE INDEXproduct_id

CREATE UNIQUE INDEX line_items_prod_id_var_null_idx 
ON line_items (product_id) 
WHERE variant_id IS NULL; 

这样你就可以进入(1,2)(1,3)(1, NULL),但他们都没有第二次。还可以加快一列或两列的查询条件。

answer on dba.SE我最近写的是非常相似,几乎直接适用于你的问题。

0

另一种选择是在关键字段中使用表达式。当你问这个问题时,这可能还没有出现,但对现在遇到的其他人可能会有所帮助。

CREATE UNIQUE INDEX line_items_prod_id_var_id_idx 
ON line_items (product_id, (coalesce(variant_id, 0))); 

当然,这假定您的variant_id是一个自动递增整数,从1开始。还要注意周围的表达括号。根据文档,它们是必需的。

http://www.postgresql.org/docs/9.3/static/sql-createindex.html