Това изглежда е недоразумение.
Вашият цитат от моя отговор е малко подвеждащ, тъй като се прилага само ако създадете и допълнителния частичен индекс, както е описано тук:
Как да добавите условен уникален индекс на 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
.