Dette ser ud til at være en misforståelse.
Dit citat fra mit svar er lidt misvisende, da det kun gælder, hvis du også opretter det ekstra delindeks som beskrevet derovre:
Sådan tilføjer du et betinget unikt indeks på PostgreSQL
Hvis du ikke tilføjer dette andet indeks (som du ikke gjorde), har du allerede din løsning , ser det ud til. Med det unikke multikolonneindeks alene kan du indtaste (1, NULL)
flere gange, men (1,2)
eller (1,3)
kun én gang.
Tomme strenge
Hvis du ved en fejl overvejede tomme strenge (''
) (for en tegntype
) i stedet for NULL
værdier:disse håndteres som enhver anden værdi. Du kunne håndtere denne situation ved hjælp af et flerkolonne, delvist funktionelt unikt indeks (indeks over et udtryk
):
CREATE UNIQUE INDEX predictions _dim_tat_uni_idx
ON predictions (tat, NULLIF(dim, ''));
På denne måde kan du indtaste (1, 'a')
, (1, 'b')
kun én gang.
Men (1, NULL)
og (1, '')
flere gange.
Bivirkninger
Indekset vil stadig fuldt ud understøtte almindelige forespørgsler i den første kolonne (tat
).
Men forespørgsler på begge kolonner skal matche udtrykket for at udnytte det fulde potentiale. Dette ville være hurtigere, selvom det ikke ser ud til at give mening:
SELECT * FROM predictions
WHERE tat = 1
AND NULLIF(dim, '') = 'foo';
.. end dette:
SELECT * FROM predictions
WHERE tat = 1
AND dim = 'foo';
.. fordi den første forespørgsel kan bruge begge indekskolonner. Resultatet ville være det samme (undtagen når du søger efter ''
eller NULL
). Detaljer i dette relaterede svar på dba.SE
.