4

この問題は過去に提起されたものですが、これが大きな(3Mで成長している)テーブル内の重複するエントリをクリーンアップするための最良の方法であるかどうか、私は興味があります。一括挿入するたびに、この行を実行して整理しますが、実行に非常に長い時間がかかり始めています。

重複する行は、3つの列でのみ判別できます。その他は、自動インクリメント、uniqueID、ソースなどのいずれかです。

これが私が現在行っていることです-

DELETE n1 
FROM main n1, main n2 
WHERE n1.id < n2.id 
AND n1.col1 = n2.col1 
AND n1.col2 = n2.col2 
AND n1.col3 = n2.col3

私がこれをスピードアップできる可能性はありますか、それともこれは最高ですか?

ヘルプ/洞察をありがとう!

4

2 に答える 2

2

このように、列col1、col2、およびcol2のテーブルに一意のインデックスを追加します。

ALTER TABLE `main` ADD UNIQUE INDEX `col1_col2_col3` (`col1`, `col2`, `col3`);

これにより、テーブルに重複する行が挿入されるのを防ぐことができます。

例:この値を挿入した後。

INSERT INTO `main` (`col1`, `col2`, `col3`) VALUES (1, 11, 111);

これを挿入することはできません。重複行エラーが発生します

INSERT INTO `main` (`col1`, `col2`, `col3`) VALUES (1, 11, 111);

正しい一意のインデックスがあれば、後でレコードの重複を心配する必要はありません。

于 2012-10-31T22:52:43.530 に答える
1

他のポスターに同意します-重複を制約するためにUNIQUEKEYを追加できます。

重複を削除したい場合は、このクエリを使用できます-

DELETE t1 FROM main t1
  JOIN (SELECT MIN(id) id, col1, col2, col3 FROM main
        GROUP BY col1, col2, col3) t2
  ON
    t1.id <> t2.id AND
    t1.col1 = t2.col1 AND t1.col2 = t2.col2 AND t1.col3 = t2.col3;
于 2012-11-01T07:23:17.587 に答える