sql >> Databasteknik >  >> RDS >> PostgreSQL

Skapa ett index med flera kolumner för att framtvinga unikhet

Detta verkar vara ett missförstånd.

Ditt citat från mitt svar är lite missvisande, eftersom det bara gäller om du också skapar det extra partiella indexet som beskrivs där:
Hur man lägger till ett villkorligt unikt index på PostgreSQL

Om du inte lägger till detta andra index (som du inte gjorde), har du redan din lösning , det verkar som. Enbart med det unika flerkolumnindexet kan du ange (1, NULL) flera gånger, men (1,2) eller (1,3) bara en gång.

Tömma strängar

Om du av misstag övervägde tomma strängar ('' ) (för en teckentyp ) istället för NULL värden:dessa hanteras som alla andra värden. Du kunde hantera denna situation med ett flerkolumn, delvis funktionellt unikt index (indexera på ett uttryck ):

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

På så sätt kan du ange (1, 'a') , (1, 'b') bara en gång.
Men (1, NULL) och (1, '') flera gånger.

Biverkningar

Indexet skulle fortfarande fullt ut stödja vanliga frågor i den första kolumnen (tat ).
Men frågor i båda kolumnerna måste matcha uttrycket för att utnyttja den fulla potentialen. Detta skulle vara snabbare, även om det inte verkar vara vettigt:

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

.. än så här:

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

.. eftersom den första frågan kan använda båda indexkolumnerna. Resultatet skulle vara detsamma (förutom när du söker efter '' eller NULL ). Detaljer i detta relaterade svar på dba.SE .




  1. 4 sätt att ändra tidszonen i Oracle

  2. Hur man sammanfogar flera (3+) tabeller i ett uttalande

  3. Hur kan jag använda mySQL replace() för att ersätta strängar i flera poster?

  4. Hur man får status för en pågående fråga i postgresql-databasen