sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan håndhæver PostgreSQL den UNIKKE begrænsning / hvilken type indeks bruger den?

eller - opret et indeks og ikke antag, at værdierne er unikke

Det er sikkert at antage, at værdier er unik, hvis du har et unikt indeks defineret. Det er sådan, unikke begrænsninger implementeres (i øjeblikket og sandsynligvis også i alle fremtidige versioner).

Definition af en UNIQUE begrænsning gør effektivt det samme (næsten, se nedenfor) som at skabe et unikt indeks uden at angive indekstypen. Og jeg citerer manualen:

Valgmulighederne er btree, hash, gist og gin. Standardmetoden er btree.

Tilføjelse af en begrænsning er bare den kanoniske måde, som ikke ville bryde i fremtidige versioner, hvor det kunne implementeres anderledes. Det er alt.

Og nej, en unik begrænsning kan kun implementeres med et grundlæggende btree indeks i alle versioner til og med PostgreSQL v14. Jeg citerer afsnittet "ADD table_constraint_using_index" i manualen her:

Indekset kan ikke have udtrykskolonner eller være et delvist indeks. Det skal også være et b-træ-indeks med standard sorteringsrækkefølge.

###Andre forskelle

  • Unikke begrænsninger kan udskydes . Det er ikke muligt for unikke indekser. Tag et kig på SET CONSTRAINTS kommando og følg linkene for mere.
- En **fremmednøgle** kan ikke referere til kolonner med *bare* et unikt indeks. [Manualen:][4]

En fremmednøgle skal referere til kolonner, der enten er en primær nøgle eller udgør en unik begrænsning.

Det sidste ser ud til at være forældet eller en misforståelse fra starten. Se:

  • NULL-værdier for referential_constraints.unique_constraint_*-kolonner i informationsskema

Relateret:

  • Er unikt indeks bedre end unikt begrænsning, når jeg har brug for et indeks med en operatorklasse



  1. Hvordan henter man et billede fra en SQLite-database?

  2. Sjovt med (columnstore) komprimering på et meget stort bord – del 1

  3. Resten i PostgreSQL, MS SQL Server, MySQL og SQLite

  4. ASIN() Eksempler i SQL Server