postgresql - 在没有主键或唯一约束的列上删除重复项
问题描述
我有一个包含实时生产数据的数据库,并且在这个数据库中有一个存储关系链接(又名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 行?
解决方案
您可以使用 ctid 系统列来区分行:
DELETE FROM your_table t1
USING your_table t2
WHERE t1 = t2
AND t1.ctid > t2.ctid;
推荐阅读
- python - 我有通过 IMSHOW () 函数显示的 Tensorflow 代码。帮助,我需要将它输出到 Tkinter 以进一步构建接口
- java - 如何将资源文件夹中的jar文件中的类导入包中的另一个类?
- flutter - 参数类型'Future
' 不能分配给参数类型 'List ' - java - 在 Maven 版本中忽略 ${project.version}:准备
- json - 将变量插入 JSON 有效负载
- asp.net-core - 无法从 OnPost() 中的 OnGet() 访问我的列表
- javascript - 如何从javascript中的对象中获取匹配的键值
- swift - 如何在我的 macos Swift 框架中 *** 包含 *** 源代码
- python - telegraf 和 Influxdb 的 Json 数据格式
- c# - C# WPF:如何检查打印机选项:“Microsoft Print to PDF”是否存在