Achei útil adicionar um índice exclusivo usando um "ALTER IGNORE" que remove as duplicatas e impõe registros exclusivos, o que parece que você gostaria de fazer. Portanto, a sintaxe seria:
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`);
Isso efetivamente adiciona a restrição exclusiva, o que significa que você nunca terá registros duplicados e o IGNORE exclui as duplicatas existentes.
Você pode ler mais sobre eh ALTER IGNORE aqui: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/
Update: Fui informado por @Inquisitive que isso pode falhar nas versões do MySql> 5.5:
Ele falha no MySQL> 5.5 e na tabela InnoDB, e no Percona por causa de seu recurso de criação rápida de índice InnoDB [ http://bugs.mysql.com/bug.php?id=40344] . Neste caso, execute primeiro set session old_alter_table=1e então o comando acima funcionará bem
Atualização - ALTER IGNORERemovido em 5.7
Dos documentos
A partir do MySQL 5.6.17, a cláusula IGNORE está obsoleta e seu uso gera um aviso. IGNORE foi removido do MySQL 5.7.
Um dos desenvolvedores do MySQL oferece duas alternativas :
- Agrupe pelos campos exclusivos e exclua como visto acima
- Crie uma nova tabela, adicione um índice exclusivo, use
INSERT IGNORE, por exemplo:
CREATE TABLE duplicate_row_table LIKE regular_row_table;
ALTER TABLE duplicate_row_table ADD UNIQUE INDEX (id, another_id);
INSERT IGNORE INTO duplicate_row_table SELECT * FROM regular_row_table;
DROP TABLE regular_row_table;
RENAME TABLE duplicate_row_table TO regular_row_table;
Mas dependendo do tamanho da sua mesa, isso pode não ser prático