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

Wie erzwingt PostgreSQL die UNIQUE-Einschränkung / welche Art von Index verwendet es?

oder - Erstellen Sie einen Index und gehen Sie nicht davon aus, dass die Werte eindeutig sind

Es ist davon auszugehen, dass Werte sind unique, wenn Sie einen eindeutigen Index definiert haben. Auf diese Weise werden eindeutige Einschränkungen implementiert (derzeit und wahrscheinlich auch in allen zukünftigen Versionen).

Definieren eines UNIQUE Constraint macht im Grunde dasselbe (fast, siehe unten) als einen eindeutigen Index zu erstellen, ohne den Indextyp anzugeben. Und ich zitiere das Handbuch:

Zur Auswahl stehen btree, hash, gist und gin. Die Standardmethode ist btree.

Das Hinzufügen einer Einschränkung ist nur der kanonische Weg, der in zukünftigen Versionen nicht brechen würde, wo es konnte unterschiedlich umgesetzt werden. Das ist alles.

Und nein, eine eindeutige Beschränkung kann nur mit einem einfachen btree implementiert werden index in allen Versionen bis einschließlich PostgreSQL v14. Ich zitiere hier den Abschnitt "ADD table_constraint_using_index" im Handbuch:

Der Index darf weder Ausdrucksspalten haben noch ein partieller Index sein. Außerdem muss es ein B-Tree-Index mit Standard-Sortierreihenfolge sein.

###Andere Unterschiede

  • Eindeutige Beschränkungen können aufgeschoben werden . Dies ist bei eindeutigen Indizes nicht möglich. Sehen Sie sich die SET CONSTRAINTS an Befehl und folgen Sie den Links für mehr.
- Ein **Fremdschlüssel** kann nicht auf Spalten mit *nur* einem eindeutigen Index verweisen. [Das Handbuch:][4]

Ein Fremdschlüssel muss auf Spalten verweisen, die entweder ein Primärschlüssel sind oder eine eindeutige Einschränkung bilden.

Das letzte Bit scheint veraltet oder ein Missverständnis von Anfang an zu sein. Siehe:

  • NULL-Werte für referential_constraints.unique_constraint_*-Spalten im Informationsschema

Verwandte:

  • Ist ein eindeutiger Index besser als eine eindeutige Einschränkung, wenn ich einen Index mit einer Operatorklasse benötige?