PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Crea un indice multicolonna per imporre l'unicità

Questo sembra essere un malinteso.

La tua citazione dalla mia risposta è un po' fuorviante, poiché si applica solo se crei anche l'indice parziale aggiuntivo come descritto laggiù:
Come aggiungere un indice univoco condizionale su PostgreSQL

Se non aggiungi questo secondo indice (come non hai fatto), hai già la tua soluzione , sembrerebbe. Con il solo indice univoco multicolonna, puoi inserire (1, NULL) più volte, ma (1,2) o (1,3) solo una volta.

Stringhe vuote

Se, per errore, stavi considerando stringhe vuote ('' ) (per un tipo di carattere ) invece di NULL valori:quelli vengono gestiti come qualsiasi altro valore. Potresti affrontare questa situazione utilizzando un indice unico multicolonna, parzialmente funzionale (indice su un'espressione ):

CREATE UNIQUE INDEX predictions _dim_tat_uni_idx
ON predictions (tat, NULLIF(dim, ''));

In questo modo puoi inserire (1, 'a') , (1, 'b') solo una volta.
Ma (1, NULL) e (1, '') più volte.

Effetti collaterali

L'indice supporterà comunque completamente le query semplici sulla prima colonna (tat ).
Ma le query su entrambe le colonne dovrebbero corrispondere all'espressione per sfruttare appieno il potenziale. Sarebbe più veloce, anche se non sembra avere senso:

SELECT * FROM predictions
WHERE  tat = 1
AND    NULLIF(dim, '') = 'foo';

..di questo:

SELECT * FROM predictions
WHERE  tat = 1
AND    dim = 'foo';

.. perché la prima query può utilizzare entrambe le colonne di indice. Il risultato sarebbe lo stesso (tranne quando si cerca '' o NULL ). Dettagli in questa risposta correlata su dba.SE .