【发布时间】:2014-04-03 17:11:17
【问题描述】:
我收到了一个陷入奇怪状态的数据库。在过去的某个不确定的时间,我最终遇到了这样一种情况,即我在同一个表中使用相同的主键有重复的行:
=> \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;
它只是要从表中删除 一个 行,还是要删除具有给定主键的两行?
【问题讨论】:
-
据我所知,您输入的 SQL 无效 - the Postgres manual page for
DELETEstatements 没有提及LIMIT子句。所以直接问题的答案是“不会,它会出错”。 “如何删除一对重复项中的一行”这个隐含问题的答案可以在别处找到。 -
问题的标题应该更像“如何修复损坏的唯一索引”
标签: postgresql indexing corruption unique-index