Utwórz UNIQUE indeks wielokolumnowy w (product_id, variant_id) :
CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
Jednak pozwoliłoby to na wiele wpisów (1, NULL) dla (product_id, variant_id) ponieważ NULL wartości nie są uważane za identyczne.
Aby to zrekompensować, dodatkowo utwórz częściowy UNIQUE indeks na product_id :
CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;
W ten sposób możesz wpisać (1,2) , (1,3) i (1, NULL) , ale żaden z nich nie po raz drugi. Przyspiesza także zapytania z warunkami w jednej lub obu kolumnach.
Niedawna, powiązana odpowiedź na dba.SE, prawie bezpośrednio odnosząca się do Twojej sprawy:
- Unikatowe ograniczenie wielokolumnowe PostgreSQL i wartości NULL