Créer un UNIQUE index multicolonne sur (product_id, variant_id) :
CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
Cependant, cela autoriserait plusieurs entrées de (1, NULL) pour (product_id, variant_id) car NULL les valeurs ne sont pas considérées comme identiques.
Pour compenser cela, créez en plus un UNIQUE partiel index sur product_id :
CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;
De cette façon, vous pouvez saisir (1,2) , (1,3) et (1, NULL) , mais ni l'un ni l'autre une seconde fois. Accélère également les requêtes avec des conditions sur une ou les deux colonnes.
Réponse récente et connexe sur dba.SE, presque directement applicable à votre cas :
- Contrainte unique multi-colonnes PostgreSQL et valeurs NULL