0

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

4

2 回答 2

2

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

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

要创建表:

create table MyWorkData as select distinct * from MyTable;

删除 MyTable

delete from MyTable;

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

INSERT INTO MyTable SELECT * FROM MyWorkData

最后删除工作表。

于 2017-08-14T19:25:25.980 回答
2

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

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

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

请注意,rowid您的Row_ID专栏不同。rowid是一个内部 CockroachDB 列,它是为没有主键的表神奇地创建的,并且保证对于表中的每一行都是唯一的。

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

于 2017-08-14T19:25:26.780 回答