首页 > 解决方案 > 在没有主键或唯一约束的列上删除重复项

问题描述

我有一个包含实时生产数据的数据库,并且在这个数据库中有一个存储关系链接(又名column1 = table_a_id, column2 = table_b_id)的表。我注意到,当创建此表时,从未创建跨两个关系 ID 的主键或唯一约束,因此允许表中存在重复链接。事实证明,正如我所尝试的那样ALTER TABLE x ADD PRIMARY KEY(table_a_id, table_b_id),更改失败了,因为实际上有一些重复项。

我需要先清除重复项,然后才能建立主键,但我不能只使用DELETE,因为任何DELETE针对重复项的执行也将针对我想要保留的行。

有没有办法删除与所有列中的另一行完全相同的行而不删除另一行?

例如:

+------------+------------+-------------+
| table_a_id | table_b_id | other_data  |
+------------+------------+-------------+
|          1 |          1 | <some data> |
|          2 |          2 | <some data> |
|          3 |          2 | <some data> |
|          1 |          3 | <some data> |
|          3 |          2 | <some data> | // Duplicate row
+------------+------------+-------------+

在这个例子中,如何删除第 5 行而不影响第 3 行?

标签: postgresql

解决方案


您可以使用 ctid 系统列来区分行:

DELETE FROM your_table t1
USING your_table t2
WHERE t1 = t2
AND t1.ctid > t2.ctid;

推荐阅读