2012-01-18 38 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