Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Excluindo linhas duplicadas da tabela MySql


Você tem várias opções.

Deixe o banco de dados fazer o trabalho


Crie uma cópia de sua tabela com um índice exclusivo - e insira os dados nela de sua tabela de origem:
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;

A vantagem de fazer as coisas dessa maneira é que você pode verificar se sua nova tabela está correta antes de descartar sua tabela de origem. A desvantagem é que ocupa o dobro de espaço e é (relativamente) lento para executar.

Deixe o banco de dados fazer o trabalho #2


Você também pode alcançar o resultado desejado fazendo:
set session old_alter_table=1;
ALTER IGNORE TABLE pst_nw ADD UNIQUE INDEX (add1, add2, add3, add4);

O primeiro comando é necessário como uma solução alternativa para o sinalizador de ignorar sendo .. ignorado

A vantagem aqui é que não há como mexer com uma tabela temporária - a desvantagem é que você não pode verificar se sua atualização faz exatamente o que você espera antes de executá-la.

Exemplo:
 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)

Não faça esse tipo de coisa fora do banco de dados


Especialmente com 40 milhões de linhas, fazer algo assim fora do banco de dados provavelmente levará muito tempo e pode não ser concluído. Qualquer solução que permaneça no banco de dados será mais rápida e mais robusta.