Подтвердить что ты не робот

Последовательное сканирование и индексное сканирование для первичного ключа возвращают разные строки

У меня проблема с данными в моей таблице users. Эта таблица имеет первичный ключ, определяемый как:

"primary_c26a3d1a9d1c7aa4bb0a8d6b752c01a7" PRIMARY KEY, btree (id)

Когда я использую предложение WITH, чтобы принудительно выполнить последовательное сканирование в таблице, я обнаруживаю повторяющиеся идентификаторы:

=> WITH temp_table AS (select * from "users") SELECT id from temp_table group by id having count(id) > 1;
-[ RECORD 1 ]
id | 8225700
-[ RECORD 2 ]
id | 8225682
...

Как это происходит? Если я ищу эти дубликаты по индексу, у меня нет такой же проблемы:

=> select count(*) from users where id = 8225700;
-[ RECORD 1 ]
count | 1

Я использую PostgreSQL 9.1.

ВАКУУМ мне не помог. Я попытался удалить дубликаты ctid:

// good and bad rows
> with usrs as (select ctid, * from users) select ctid, id from usrs where id = 8225700;
ctid     |   id    
-------------+---------
(195669,33) | 8225700
(195708,34) | 8225700

// good row
select id, ctid from users where id = 8225700;
-[ RECORD 1 ]-----
id   | 8225700
ctid | (195708,34)

// deleting bad row
DELETE FROM users WHERE ctid = '(195669,33)';
ERROR:  update or delete on table "users" violates foreign key constraint   "foreign_1589fcbc580d08caf03e0fbaaca7d6dd" on table "account"

Подробнее: Key (id) = (8225700) по-прежнему ссылается на таблицу account.

Но в реальной строке есть ссылки, и я не могу ее удалить.

Как удалить эти разбитые строки?

4b9b3361

Ответ 1

// deleting bad row DELETE FROM users WHERE ctid = '(195669,33)';
ERROR:  update or delete on table "users" violates foreign key
constraint   "foreign_1589fcbc580d08caf03e0fbaaca7d6dd" on table
"account"

In detail: Key (id)=(8225700) is still referenced from table
"account".

Это говорит совершенно ясно: строка ссылается на таблицу account.

Вам нужно найти ссылку и исправить ее.

UPDATE account SET fkey_field = ??? WHERE ... ;

Подробности зависят от структуры и содержимого таблицы account.

Если вам нужна дополнительная помощь, вставьте полный вывод \d account и \d users из psql.

Ответ 2

Звучит как плохой индекс для меня. Попробуйте перестроить свои индексы.

reindex table users