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

Removendo duplicatas com índice exclusivo


Se você tiver duplicatas em sua tabela e usar
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);

a consulta falhará com o erro 1062 (chave duplicada).

Mas se você usar IGNORE
-- (only works before MySQL 5.7.4)
ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);

as duplicatas serão removidas. Mas a documentação não especifica qual linha será mantida:

(Sintaxe ALTER TABLE )

Se sua versão for 5.7.4 ou superior - você pode:
  • Copie os dados em uma tabela temporária (tecnicamente não precisa ser temporária).
  • Truncar a tabela original.
  • Crie o ÍNDICE ÚNICO.
  • E copie os dados de volta com INSERT IGNORE (que ainda está disponível).
CREATE TABLE tmp_data SELECT * FROM mytable;
TRUNCATE TABLE mytable;
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
INSERT IGNORE INTO mytable SELECT * from tmp_data;
DROP TABLE tmp_data;

(INSERIR Sintaxe)

Veja também:INSERT ... SELECT Syntax e Comparação da palavra-chave IGNORE e Modo SQL estrito