Dies scheint ein Missverständnis zu sein.
Ihr Zitat aus meiner Antwort ist etwas irreführend, da es nur gilt, wenn Sie auch den zusätzlichen Teilindex wie dort beschrieben erstellen:
So fügen Sie einen bedingten eindeutigen Index in PostgreSQL hinzu
Wenn Sie diesen zweiten Index nicht hinzufügen (wie Sie es nicht getan haben), haben Sie bereits Ihre Lösung , scheint es. Allein beim mehrspaltigen eindeutigen Index können Sie (1, NULL)
eingeben mehrmals, aber (1,2)
oder (1,3)
nur einmal.
Leere Zeichenfolgen
Falls Sie irrtümlich an leere Strings gedacht haben (''
) (für einen Zeichentyp
) statt NULL
Werte:Diese werden wie alle anderen Werte behandelt. Sie könnten Bewältigen Sie diese Situation mit einem mehrspaltigen, teilweise funktionalen eindeutigen Index (Index für einen Ausdruck
):
CREATE UNIQUE INDEX predictions _dim_tat_uni_idx
ON predictions (tat, NULLIF(dim, ''));
Auf diese Weise können Sie (1, 'a')
eingeben , (1, 'b')
nur einmal.
Aber (1, NULL)
und (1, '')
mehrmals.
Nebenwirkungen
Der Index würde weiterhin einfache Abfragen in der ersten Spalte vollständig unterstützen (tat
).
Aber Abfragen in beiden Spalten müssten mit dem Ausdruck übereinstimmen, um das volle Potenzial auszuschöpfen. Das geht schneller, auch wenn es nicht sinnvoll erscheint:
SELECT * FROM predictions
WHERE tat = 1
AND NULLIF(dim, '') = 'foo';
.. als das:
SELECT * FROM predictions
WHERE tat = 1
AND dim = 'foo';
.. weil die erste Abfrage beide Indexspalten verwenden kann. Das Ergebnis wäre dasselbe (außer bei der Suche nach ''
oder NULL
). Details in dieser zugehörigen Antwort auf dba.SE
.