LIMIT如何通过Postgres中的主键与DELETE交互? (修复损坏的唯一索引)

时间:2014-04-03 17:11:17

标签: postgresql indexing corruption unique-index

我被交给了一个陷入奇怪状态的数据库。在过去的某个不确定时间,我最终遇到了同一个表中具有相同主键的重复行的情况:

=> \d my_table
Table "public.my_table"
       Column       |          Type           | Modifiers 
--------------------+-------------------------+-----------
 id                 | bigint                  | not null
 some_data          | bigint                  | 
 a_string           | character varying(1024) | not null
Indexes:
"my_table_pkey" PRIMARY KEY, btree (id)

=> SELECT id, count(*) FROM my_table GROUP BY id HAVING count(*) > 1 ORDER BY id;
#50-some results, non-consecutive rows.

我不知道数据库是如何进入这种状态的,但我希望能够安全地摆脱它。如果,对于每个重复的主键,如果我执行表单的查询:

DELETE FROM my_table WHERE id = "a_duplicated_row" LIMIT 1;

它只是从表中删除一个行,还是要用给定的主键删除这两行?

1 个答案:

答案 0 :(得分:3)

唉,PostgreSQL还没有为DELETE或UPDATE实现LIMIT。如果行无法通过其他方式区分,则需要谨慎使用隐藏的ctid列来打破关系,就像讨论here一样。或者只需通过从现有表中选择不同的元组并重命名来创建表。