Maak een UNIQUE index met meerdere kolommen op (product_id, variant_id) :
CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
Dit zou echter meerdere invoer van (1, NULL) . mogelijk maken voor (product_id, variant_id) omdat NULL waarden worden niet als identiek beschouwd.
Om dat goed te maken, maakt u bovendien een gedeeltelijke UNIQUE index op product_id :
CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;
Op deze manier kunt u (1,2) . invoeren , (1,3) en (1, NULL) , maar geen van beiden een tweede keer. Versnelt ook zoekopdrachten met voorwaarden in een of beide kolommen.
Recent, gerelateerd antwoord op dba.SE, bijna direct van toepassing op uw geval:
- PostgreSQL-unieke beperking met meerdere kolommen en NULL-waarden