我有一個line_items
表列如下:如何添加一個有條件的唯一索引PostgreSQL的
product_id
variant_id
variant_id
爲空。
這裏的條件:
- 如果
variant_id
爲NULL,則product_id
應該是唯一的。 - 如果
variant_id
有一個值,則product_id
和variant_id
的組合應該是唯一的。
PostgreSQL中可能嗎?
我有一個line_items
表列如下:如何添加一個有條件的唯一索引PostgreSQL的
product_id
variant_id
variant_id
爲空。
這裏的條件:
variant_id
爲NULL,則product_id
應該是唯一的。variant_id
有一個值,則product_id
和variant_id
的組合應該是唯一的。PostgreSQL中可能嗎?
創建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 INDEX上product_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我最近寫的是非常相似,幾乎直接適用於你的問題。
另一種選擇是在關鍵字段中使用表達式。當你問這個問題時,這可能還沒有出現,但對現在遇到的其他人可能會有所幫助。
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