我被交给了一个陷入奇怪状态的数据库。在过去的某个不确定时间,我最终遇到了同一个表中具有相同主键的重复行的情况:
=> \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;
它只是从表中删除一个行,还是要用给定的主键删除这两行?
答案 0 :(得分:3)
唉,PostgreSQL还没有为DELETE或UPDATE实现LIMIT。如果行无法通过其他方式区分,则需要谨慎使用隐藏的ctid
列来打破关系,就像讨论here一样。或者只需通过从现有表中选择不同的元组并重命名来创建表。