如何删除 CockroachDB 中的重复行

问题描述 投票:0回答:3

我在 CockroachDB 中有一个表,在应用约束设置主键之前我已经将数据填充到表中,并且由于某些 INSERT 语句在数据加载阶段失败,所以一些行被加载到表中更多比一次错误。

我要应用的约束是:

CREATE UNIQUE INDEX ON "MyDB"."MyTable" ("Row_ID");

但是由于重复的数据已经加载到表中,我收到以下错误:

pq: multiple primary keys for table "MyTable" are not allowed

我检查了以下查询是否确实存在一些重复的行:

SELECT  
    Row_ID,
    COUNT(Row_ID) as id
FROM    
    MyTable
GROUP BY 
    Row_ID
HAVING  
    COUNT(Row_ID) > 1;

查询显示存在一些重复的行。

删除 CockroachDB 中重复行的最佳方法是什么?

duplicates sql-delete cockroachdb
3个回答
3
投票

如果您不关心保留哪个重复行,请运行:

DELETE FROM MyTable WHERE rowid IN ( SELECT MIN(rowid) FROM MyTable GROUP BY Row_ID HAVING COUNT(*) > 1 );

对于任何重复项,该查询将删除除首先粗略创建的行之外的所有行。†

请注意,

rowid

与您的
Row_ID
相同。 
rowid
 是一个 CockroachDB 内部列,它是为没有主键的表神奇地创建的,并且保证表中的每一行都是唯一的。 

rowid

 存储 
<timestamp><node-id>
,因此它大致根据插入时间排序,但是由具有倾斜时钟的节点几乎同时插入的行可能不会按插入顺序排序。


2
投票
如果它们完全匹配,您可以使用不同的记录创建一个新表。

然后删除所有旧表并从上一步创建的表中重新填充它。

创建表格:

create table MyWorkData as select distinct * from MyTable;

删除我的表

delete from MyTable;

重新填充 MyTable。 (感谢@benesch纠正该声明)

INSERT INTO MyTable SELECT * FROM MyWorkData

最后删除工作台。


0
投票
如果您不关心订单:

DELETE FROM MyTable WHERE Row_ID NOT IN ( SELECT MIN(Row_ID) FROM MyTable GROUP BY Row_ID);
    
© www.soinside.com 2019 - 2024. All rights reserved.