我收到了一个陷入奇怪状态的数据库。在过去的某个不确定的时间,我最终遇到了同一个表中具有相同主键的重复行的情况:
=> \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;
它只会从表中删除一行行,还是会删除具有给定主键的两行?
最佳答案
可惜,PostgreSQL 尚未实现 DELETE 或 UPDATE 的 LIMIT。如果行在其他方面都无法区分,则需要小心使用隐藏的 ctid 列来打破联系,如讨论的 here 所示。 。或者只是通过从现有表中选择不同的元组并重命名来创建表。
关于postgresql - Postgres 中 LIMIT 如何通过主键与 DELETE 交互? (修复损坏的唯一索引),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22844471/