2017-08-14 87 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