Yinelenenleri kaldıran ve yapmak istediğiniz gibi görünen benzersiz kayıtları zorlayan bir "ALTER IGNORE" kullanarak benzersiz bir dizin eklemeyi yararlı buldum. Dolayısıyla sözdizimi şöyle olacaktır:
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`);
Bu, benzersiz kısıtlamayı etkili bir şekilde ekler, yani hiçbir zaman yinelenen kayıtlara sahip olmayacaksınız ve IGNORE, mevcut kopyaları siler.
ALTER IGNORE hakkında daha fazla bilgiyi buradan okuyabilirsiniz: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/
Güncelleme: @Inquisitive tarafından bunun MySql> 5.5 sürümlerinde başarısız olabileceği konusunda bilgilendirildim:
MySQL> 5.5 ve InnoDB tablosunda ve InnoDB hızlı dizin oluşturma özelliği nedeniyle Percona'da başarısız olur [ http://bugs.mysql.com/bug.php?id=40344] . Bu durumda önce çalıştırın set session old_alter_table=1ve ardından yukarıdaki komut düzgün çalışacaktır.
Güncelleme - ALTER IGNORE5.7'de Kaldırıldı
Gönderen docs
MySQL 5.6.17'den itibaren, IGNORE yan tümcesi kullanımdan kaldırılmıştır ve kullanımı bir uyarı oluşturur. IGNORE, MySQL 5.7'de kaldırılmıştır.
MySQL geliştiricilerinden biri iki alternatif sunar :
- Benzersiz alanlara göre gruplayın ve yukarıda görüldüğü gibi silin
- Yeni bir tablo oluşturun, benzersiz bir dizin ekleyin
INSERT IGNORE, örn:
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;
Ancak tablonuzun büyüklüğüne bağlı olarak bu pratik olmayabilir