Crie um
UNIQUE índice de várias colunas em (product_id, variant_id) :CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
No entanto, isso permitiria várias entradas de
(1, NULL) para (product_id, variant_id) porque NULL os valores não são considerados idênticos.Para compensar isso, crie adicionalmente um
UNIQUE parcial índice em product_id :CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;
Desta forma, você pode inserir
(1,2) , (1,3) e (1, NULL) , mas nenhum deles uma segunda vez. Também acelera as consultas com condições em uma ou ambas as colunas. Resposta recente e relacionada no dba.SE, quase diretamente aplicável ao seu caso:
- Restrição exclusiva de várias colunas do PostgreSQL e valores NULL