Mysql
 sql >> Database >  >> RDS >> Mysql

Eliminazione di righe duplicate dalla tabella MySql

Hai diverse opzioni.

Lascia che il DB faccia il lavoro

Crea una copia della tua tabella con un indice univoco, quindi inserisci i dati in essa dalla tabella di origine:

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;

Il vantaggio di fare le cose in questo modo è che puoi verificare che la tua nuova tabella sia corretta prima di eliminare la tabella di origine. Lo svantaggio è che occupa il doppio dello spazio ed è (relativamente) lento da eseguire.

Lascia che il DB faccia il lavoro #2

Puoi anche ottenere il risultato che desideri facendo:

set session old_alter_table=1;
ALTER IGNORE TABLE pst_nw ADD UNIQUE INDEX (add1, add2, add3, add4);

Il primo comando è richiesto come soluzione alternativa per il flag ignore viene .. ignorato

Il vantaggio qui è che non c'è niente da fare con una tabella temporanea:lo svantaggio è che non puoi controllare che il tuo aggiornamento faccia esattamente quello che ti aspetti prima di eseguirlo.

Esempio:

 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)

Non fare questo genere di cose al di fuori del DB

Soprattutto con 40 milioni di righe che fanno qualcosa del genere al di fuori del db è probabile che richieda un'enorme quantità di tempo e potrebbe non essere completato affatto. Qualsiasi soluzione che rimane nel db sarà più veloce e più robusta.