Sie haben mehrere Möglichkeiten.
Lass die DB die Arbeit machen
Erstellen Sie eine Kopie Ihrer Tabelle mit einem eindeutigen Index - und fügen Sie dann die Daten aus Ihrer Quelltabelle ein:
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;
Der Vorteil dieser Vorgehensweise besteht darin, dass Sie überprüfen können, ob Ihre neue Tabelle korrekt ist, bevor Sie Ihre Quelltabelle löschen. Der Nachteil ist, dass es doppelt so viel Speicherplatz benötigt und (relativ) langsam in der Ausführung ist.
Lass die DB die Arbeit machen #2
Sie können das gewünschte Ergebnis auch erzielen, indem Sie Folgendes tun:
set session old_alter_table=1;
ALTER IGNORE TABLE pst_nw ADD UNIQUE INDEX (add1, add2, add3, add4);
Der erste Befehl ist als Problemumgehung erforderlich, damit das Ignorieren-Flag .. ignoriert wird
Der Vorteil hier ist, dass Sie nicht mit einer temporären Tabelle herumspielen müssen - der Nachteil ist, dass Sie nicht überprüfen können, ob Ihr Update genau das tut, was Sie erwarten, bevor Sie es ausführen.
Beispiel:
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)
Machen Sie so etwas nicht außerhalb der DB
Besonders bei 40 Millionen Zeilen, die so etwas außerhalb der DB tun, wird es wahrscheinlich sehr viel Zeit in Anspruch nehmen und möglicherweise überhaupt nicht abgeschlossen werden. Jede Lösung, die in der Datenbank bleibt, ist schneller und robuster.