UNIQUE индекс PostgreSQL не уникален? - PullRequest
5 голосов
/ 17 августа 2010

У меня есть таблица с 12-колоночным уникальным индексом. \d sales показывает sales_uq UNIQUE, btree (a1, a2, a3, ... a12).

Я делаю следующий запрос:

SELECT a1, a2, a3, ... a12 FROM sales GROUP BY a1, a2, a3, ... a12 HAVING count(1) > 1;

и я получаю кучу результатов. Как это возможно ?! Возможно ли, что индекс есть, но как-то отключен? Или может быть какая-то проблема с NULL? Или с числами с плавающей запятой (два столбца в индексе имеют тип double precision)?

Ответы [ 2 ]

12 голосов
/ 17 августа 2010

, поскольку два NULL не сравниваются как равные, они играют в забавные игры с УНИКАЛЬНЫМИ ограничениями.

См. Последний абзац уникальных ограничений в документации PostgreSQL :

В общем, уникальное ограничение нарушается, когда есть два или более строки в таблице, где значения все столбцы включены в ограничения равны. Тем не менее, два нулевые значения не считаются равными в этом сравнении. Это означает, что даже в наличие уникального ограничения это можно хранить дубликаты строк которые содержат нулевое значение по крайней мере один из ограниченных столбцов.

2 голосов
/ 17 августа 2010

Двойной является неточным , поэтому это может произойти. Используйте точный тип данных, и у вас не будет таких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...