Detta verkar vara ett missförstånd.
Ditt citat från mitt svar är lite missvisande, eftersom det bara gäller om du också skapar det extra partiella indexet som beskrivs där:
Hur man lägger till ett villkorligt unikt index på PostgreSQL
Om du inte lägger till detta andra index (som du inte gjorde), har du redan din lösning , det verkar som. Enbart med det unika flerkolumnindexet kan du ange (1, NULL)
flera gånger, men (1,2)
eller (1,3)
bara en gång.
Tömma strängar
Om du av misstag övervägde tomma strängar (''
) (för en teckentyp
) istället för NULL
värden:dessa hanteras som alla andra värden. Du kunde hantera denna situation med ett flerkolumn, delvis funktionellt unikt index (indexera på ett uttryck
):
CREATE UNIQUE INDEX predictions _dim_tat_uni_idx
ON predictions (tat, NULLIF(dim, ''));
På så sätt kan du ange (1, 'a')
, (1, 'b')
bara en gång.
Men (1, NULL)
och (1, '')
flera gånger.
Biverkningar
Indexet skulle fortfarande fullt ut stödja vanliga frågor i den första kolumnen (tat
).
Men frågor i båda kolumnerna måste matcha uttrycket för att utnyttja den fulla potentialen. Detta skulle vara snabbare, även om det inte verkar vara vettigt:
SELECT * FROM predictions
WHERE tat = 1
AND NULLIF(dim, '') = 'foo';
.. än så här:
SELECT * FROM predictions
WHERE tat = 1
AND dim = 'foo';
.. eftersom den första frågan kan använda båda indexkolumnerna. Resultatet skulle vara detsamma (förutom när du söker efter ''
eller NULL
). Detaljer i detta relaterade svar på dba.SE
.