我在 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 中重复行的最佳方法是什么?
如果您不关心保留哪个重复行,请运行:
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>
,因此它大致根据插入时间排序,但是由具有倾斜时钟的节点几乎同时插入的行可能不会按插入顺序排序。
然后删除所有旧表并从上一步创建的表中重新填充它。
创建表格:
create table MyWorkData as select distinct * from MyTable;
删除我的表
delete from MyTable;
重新填充 MyTable。 (感谢@benesch纠正该声明)
INSERT INTO MyTable SELECT * FROM MyWorkData
最后删除工作台。
DELETE FROM MyTable WHERE Row_ID NOT IN (
SELECT MIN(Row_ID) FROM MyTable GROUP BY Row_ID);