Почему у меня есть неуникальные записи по уникальному индексу? (PostgreSQL 9.0) - PullRequest
2 голосов
/ 16 февраля 2011

У меня есть уникальный индекс в моем postgresql 9.0 дБ, основанный на функции.Мне еще не удалось провалить тесты, которые я пробую, но я вижу некоторые дубликаты в БД при запросе.

Проверьте это:

Index: "users_screen_name_idx" UNIQUE, btree (lower(screen_name::text))

# select lower(screen_name), count(1) from users group by lower(screen_name) having count(1) > 1;

 lower         | count 
---------------+-------
 xxx xxx 3735  |     2
 xxx xxx 37383 |     2
 ... (36 more) ...
               | 17254
(39 rows)

Есть идеи, как это происходит?Я знаю, что NULL не уникальны, это не проблема, это остальные 38 строк.

Ответы [ 3 ]

1 голос
/ 16 февраля 2011

Если вы пытались вручную вызвать сбой системы базы данных, возможно, вы столкнулись с повреждением индекса.Попробуйте перестроить индекс (REINDEX).Если это не удается из-за повторяющихся значений, то это все.

0 голосов
/ 28 сентября 2012

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

Если вы удаляете и воссоздаете индекс, не получается ли это?

Если нет, ваше дублированиев другом месте.

0 голосов
/ 16 февраля 2011

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

...