Създайте UNIQUE многоколонов индекс на (product_id, variant_id) :
CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
Това обаче би позволило множество вписвания на (1, NULL) за (product_id, variant_id) защото NULL стойностите не се считат за идентични.
За да компенсирате това, създайте допълнително частичен UNIQUE индекс на product_id :
CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;
По този начин можете да въведете (1,2) , (1,3) и (1, NULL) , но нито един от тях втори път. Също така ускорява заявките с условия в едната или двете колони.
Скорошен, свързан отговор на dba.SE, почти пряко приложим за вашия случай:
- Уникално ограничение за много колони на PostgreSQL и стойности NULL