UNIQUE
を作成します (product_id, variant_id)
の複数列のインデックス :
CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
ただし、これにより、(1, NULL)
の複数のエントリが許可されます。 (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;
このようにして、(1,2)
と入力できます。 、(1,3)
および(1, NULL)
、しかしそれらのどちらも二度目ではありません。また、一方または両方の列に条件があるクエリを高速化します。
dba.SEに関する最近の関連する回答で、あなたのケースにほぼ直接当てはまります:
- PostgreSQLの複数列の一意性制約とNULL値