PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Erstellen Sie einen mehrspaltigen Index, um die Eindeutigkeit zu erzwingen

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 .