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

Opret et indeks med flere kolonner for at håndhæve unikhed

Dette ser ud til at være en misforståelse.

Dit citat fra mit svar er lidt misvisende, da det kun gælder, hvis du også opretter det ekstra delindeks som beskrevet derovre:
Sådan tilføjer du et betinget unikt indeks på PostgreSQL

Hvis du ikke tilføjer dette andet indeks (som du ikke gjorde), har du allerede din løsning , ser det ud til. Med det unikke multikolonneindeks alene kan du indtaste (1, NULL) flere gange, men (1,2) eller (1,3) kun én gang.

Tomme strenge

Hvis du ved en fejl overvejede tomme strenge ('' ) (for en tegntype ) i stedet for NULL værdier:disse håndteres som enhver anden værdi. Du kunne håndtere denne situation ved hjælp af et flerkolonne, delvist funktionelt unikt indeks (indeks over et udtryk ):

CREATE UNIQUE INDEX predictions _dim_tat_uni_idx
ON predictions (tat, NULLIF(dim, ''));

På denne måde kan du indtaste (1, 'a') , (1, 'b') kun én gang.
Men (1, NULL) og (1, '') flere gange.

Bivirkninger

Indekset vil stadig fuldt ud understøtte almindelige forespørgsler i den første kolonne (tat ).
Men forespørgsler på begge kolonner skal matche udtrykket for at udnytte det fulde potentiale. Dette ville være hurtigere, selvom det ikke ser ud til at give mening:

SELECT * FROM predictions
WHERE  tat = 1
AND    NULLIF(dim, '') = 'foo';

.. end dette:

SELECT * FROM predictions
WHERE  tat = 1
AND    dim = 'foo';

.. fordi den første forespørgsel kan bruge begge indekskolonner. Resultatet ville være det samme (undtagen når du søger efter '' eller NULL ). Detaljer i dette relaterede svar på dba.SE .




  1. Skift et logins standardsprog i SQL Server

  2. Sådan installeres MySQL på Windows 10? – Din One Stop-løsning til at installere MySQL

  3. Sådan bruges BETWEEN-tilstand ved at bruge hovedforespørgsel og underforespørgsler

  4. Hentning af værdier fra Oracle DB-tabellen til listeboksen i c# /wpf