sql >> Database >  >> RDS >> PostgreSQL

Maak een index met meerdere kolommen om uniciteit af te dwingen

Dit lijkt een misverstand te zijn.

Je citaat uit mijn antwoord is een beetje misleidend, omdat het alleen van toepassing is als je ook de aanvullende gedeeltelijke index maakt zoals daar beschreven:
Een voorwaardelijke unieke index toevoegen aan PostgreSQL

Als u deze tweede index niet toevoegt (zoals u niet deed), u heeft uw oplossing al , lijkt het. Met alleen de unieke index met meerdere kolommen kunt u (1, NULL) . invoeren meerdere keren, maar (1,2) of (1,3) slechts één keer.

Lege strings

Als u per ongeluk lege tekenreeksen overweegt ('' ) (voor een tekentype ) in plaats van NULL waarden:deze worden behandeld als elke andere waarde. Je zou omgaan met deze situatie met behulp van een multicolumn, gedeeltelijk functionele unieke index (index op een uitdrukking ):

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

Op deze manier kunt u (1, 'a') . invoeren , (1, 'b') slechts één keer.
Maar (1, NULL) en (1, '') meerdere keren.

Bijwerkingen

De index zou nog steeds volledige ondersteuning bieden voor gewone zoekopdrachten in de eerste kolom (tat ).
Maar query's op beide kolommen moeten overeenkomen met de expressie om het volledige potentieel te benutten. Dit zou sneller zijn, zelfs als het niet logisch lijkt:

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

.. dan dit:

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

.. omdat de eerste query beide indexkolommen kan gebruiken. Het resultaat zou hetzelfde zijn (behalve bij het zoeken naar '' of NULL ). Details in dit gerelateerde antwoord op dba.SE .




  1. Hoe een lijst met tabellen uit een schema in Oracle te laten vallen?

  2. QMYSQL-stuurprogramma laadfout

  3. MySQL-equivalent van de dblink-module van PostgreSQL?

  4. Hoe leg ik een query uit met parameters in MySQL