Vytvořte UNIQUE vícesloupcový index na (product_id, variant_id) :
CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
To by však umožnilo více položek (1, NULL) pro (product_id, variant_id) protože NULL hodnoty nejsou považovány za identické.
Chcete-li to nahradit, vytvořte navíc částečný UNIQUE index na product_id :
CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;
Tímto způsobem můžete zadat (1,2) , (1,3) a (1, NULL) , ale ani jeden z nich podruhé. Také urychluje dotazy s podmínkami v jednom nebo obou sloupcích.
Nedávná související odpověď na dba.SE, téměř přímo použitelná na váš případ:
- Unikátní omezení PostgreSQL ve více sloupcích a hodnoty NULL