いくつかのオプションがあります。
DBに作業を任せます
一意のインデックスを使用してテーブルのコピーを作成し、ソーステーブルからテーブルにデータを挿入します。
CREATE TABLE clean LIKE pst_nw;
ALTER IGNORE TABLE clean ADD UNIQUE INDEX (add1, add2, add3, add4);
INSERT IGNORE INTO clean SELECT * FROM pst_nw;
DROP TABLE pst_nw;
RENAME TABLE clean pst_nw;
この方法の利点は、ソーステーブルを削除する前に、新しいテーブルが正しいことを確認できることです。欠点は、2倍のスペースを占有し、実行が(比較的)遅いことです。
DBに作業を任せる#2
次の手順を実行して、希望する結果を達成することもできます。
set session old_alter_table=1;
ALTER IGNORE TABLE pst_nw ADD UNIQUE INDEX (add1, add2, add3, add4);
最初のコマンドは、無視フラグが無視される>
ここでの利点は、一時テーブルをいじることがないことです。欠点は、更新を実行する前に、更新が期待どおりに機能することを確認できないことです。
例:
CREATE TABLE `foo` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`one` int(10) DEFAULT NULL,
`two` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
)
insert into foo values (null, 1, 1);
insert into foo values (null, 1, 1);
insert into foo values (null, 1, 1);
select * from foo;
+----+------+------+
| id | one | two |
+----+------+------+
| 1 | 1 | 1 |
| 2 | 1 | 1 |
| 3 | 1 | 1 |
+----+------+------+
3 row in set (0.00 sec)
set session old_alter_table=1;
ALTER IGNORE TABLE foo ADD UNIQUE INDEX (one, two);
select * from foo;
+----+------+------+
| id | one | two |
+----+------+------+
| 1 | 1 | 1 |
+----+------+------+
1 row in set (0.00 sec)
DBの外部でこのようなことをしないでください
特に、データベースの外部でこのようなことを行う4,000万行の場合、膨大な時間がかかる可能性があり、まったく完了しない可能性があります。データベースにとどまるソリューションはすべて、より高速で堅牢になります。