PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Създайте индекс с няколко колони, за да наложите уникалност

Това изглежда е недоразумение.

Вашият цитат от моя отговор е малко подвеждащ, тъй като се прилага само ако създадете и допълнителния частичен индекс, както е описано тук:
Как да добавите условен уникален индекс на PostgreSQL

Ако не добавите този втори индекс (както не сте го направили), вече имате своето решение , изглежда. Само с многоколонния уникален индекс можете да въведете (1, NULL) няколко пъти, но (1,2) или (1,3) само веднъж.

Празни низове

Ако по погрешка сте обмисляли празни низове ('' ) (за тип знаци ) вместо NULL стойности:те се обработват като всяка друга стойност. Вие можете справете се с тази ситуация, като използвате многоколонен, частично функционален уникален индекс (индексиране на израз ):

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

По този начин можете да въведете (1, 'a') , (1, 'b') само веднъж.
Но (1, NULL) и (1, '') няколко пъти.

Странични ефекти

Индексът пак ще поддържа напълно обикновени заявки в първата колона (tat ).
Но заявките и в двете колони ще трябва да съответстват на израза, за да се използва пълният потенциал. Това би било по-бързо, дори и да изглежда безсмислено:

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

.. от това:

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

.. защото първата заявка може да използва и двете индексни колони. Резултатът ще бъде същият (освен при търсене на '' или NULL ). Подробности в този свързан отговор на dba.SE .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Връща име на колона и отделни стойности

  2. Тези проклети големи обекти

  3. За да използвате друга таблица като критерий WHERE в SQL

  4. Получете различни последователни периоди от време от припокриващи се интервали от време

  5. TemplateSyntaxError:Уловена ImportError по време на изобразяване:не може да импортира име utils