Plusieurs options s'offrent à vous.
Laissez la base de données faire le travail
Créez une copie de votre table avec un index unique, puis insérez-y les données de votre table source :
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;
L'avantage de faire les choses de cette façon est que vous pouvez vérifier que votre nouvelle table est correcte avant de supprimer votre table source. L'inconvénient est qu'il prend deux fois plus de place et qu'il est (relativement) lent à exécuter.
Laissez la base de données faire le travail #2
Vous pouvez également obtenir le résultat souhaité en faisant :
set session old_alter_table=1;
ALTER IGNORE TABLE pst_nw ADD UNIQUE INDEX (add1, add2, add3, add4);
La première commande est requise comme solution de contournement pour le drapeau ignore étant .. ignoré
L'avantage ici est qu'il n'y a pas de problème avec une table temporaire - l'inconvénient est que vous ne pouvez pas vérifier que votre mise à jour fait exactement ce que vous attendez avant de l'exécuter.
Exemple :
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)
Ne faites pas ce genre de choses en dehors de la base de données
Surtout avec 40 millions de lignes, faire quelque chose comme ça en dehors de la base de données risque de prendre énormément de temps et peut ne pas se terminer du tout. Toute solution qui reste dans la base de données sera plus rapide et plus robuste.