Създайте 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