Opret en UNIQUE multikolonneindeks på (product_id, variant_id) :
CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
Dette ville dog tillade flere indtastninger af (1, NULL) for (product_id, variant_id) fordi NULL værdier anses ikke for at være identiske.
For at kompensere for det skal du desuden oprette en delvis UNIQUE indeks på product_id :
CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;
På denne måde kan du indtaste (1,2) , (1,3) og (1, NULL) , men ingen af dem en anden gang. Fremskynder også forespørgsler med betingelser på en eller begge kolonner.
Nyligt, relateret svar på dba.SE, næsten direkte relevant for din sag:
- PostgreSQL-multi-kolonne unikke begrænsninger og NULL-værdier