sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo agregar un índice único condicional en PostgreSQL

Crea un UNIQUE índice de varias columnas en (product_id, variant_id) :

CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);

Sin embargo, esto permitiría múltiples entradas de (1, NULL) para (product_id, variant_id) porque NULL los valores no se consideran idénticos.
Para compensar eso, cree adicionalmente un UNIQUE parcial índice en product_id :

CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;

De esta manera puede ingresar (1,2) , (1,3) y (1, NULL) , pero ninguno de ellos por segunda vez. También acelera las consultas con condiciones en una o ambas columnas.

Respuesta reciente relacionada en dba.SE, casi directamente aplicable a su caso:

  • Restricción única de varias columnas de PostgreSQL y valores NULL