我在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中重复行的最佳方法是什么?
答案 0 :(得分:2)
如果它们完全匹配,您可以创建一个包含不同记录的新表。
然后删除所有旧表并从最后一步创建的表中重新填充它。
创建表格:
create table MyWorkData as select distinct * from MyTable;
删除MyTable
delete from MyTable;
重新填充MyTable。 (谢谢@benesch纠正声明)
INSERT INTO MyTable SELECT * FROM MyWorkData
最后删除工作表。
答案 1 :(得分: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>
,因此它会根据插入时间进行粗略排序,但是具有偏斜时钟的节点在近处同时插入的行可能无法按插入顺序排序。