2017-08-14 84 views
0

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

我想施加的约束是:

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中重复行的最佳方法是什么?

回答

1

如果它们完全匹配,则可以创建一个具有不同记录的新表。

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

要创建表:

create table MyWorkData as select distinct * from MyTable; 

要删除MyTable的

delete from MyTable; 

重新填充MyTable的。 (Thankyou @ benesch纠正声明)

INSERT INTO MyTable SELECT * FROM MyWorkData 

终于删除了工作表。

+0

谢谢,我试过了,每次运行查询时:create table MyWorkData as select distinct * from MyTable ;, the process will be Killed。不知道为什么,服务器没有给出任何其他原因,使用命令“free -m”,我不认为这是因为内存。 – Cyrus

+0

您也可以创建表格并用两步“select into”填充表格。 – Juan

+0

@Cyrus,您可以在日志文件中获得更详细的故障报告。请在Gitter上提出问题或与我们聊天! HTTP://小胶质。im/cockroachdb/cockroach – benesch

2

如果你不关心复制行你继续运行。

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>,所以它大致根据插入时间进行排序,但由具有倾斜时钟的节点几乎同时插入的行可能无法按插入顺序排序。

+0

所以我相信一般的建议是使用子查询,在cockroachdb的v1需要连接的地方? – fortm