Skapa en UNIQUE multikolumnindex på (product_id, variant_id) :
CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
Detta skulle dock tillåta flera inmatningar av (1, NULL) för (product_id, variant_id) eftersom NULL värden anses inte vara identiska.
För att kompensera för det skapar du dessutom en partiell UNIQUE index på product_id :
CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;
På så sätt kan du ange (1,2) , (1,3) och (1, NULL) , men ingen av dem en andra gång. Snabbar också upp frågor med villkor i en eller båda kolumnerna.
Nytt, relaterat svar på dba.SE, nästan direkt tillämpligt på ditt ärende:
- PostgreSQL flerkolumns unika begränsningar och NULL-värden