MySQL çoklu kayıtların (duplicate records) silinmesi

Veritabanı ile çalışan birçok uygulamada tablolarda oluşan çoklu kayıtların belirlenmesi için birçok yöntem uygulanmaktadır. Bazılarımız bu kayıtların silinmesi için tek tek kayıtları incelemekte ve tekrarlı olanları belirleyip tablodan silinmesi ile alakalı işlemler gerçekleştirmektedir. Aslında en iyi çözüm MySQL veritabanında unique olmasını istediğimiz elemanın daha önceden setlenmesi ile olmaktadır. Örnek verecek olursak names isimli bir tablomuz olsun ve içerisinde unique olmayan bazı kayıtlar bulunsun aşağıdaki gibi;

SELECT * FROM names;
Yukarıda yazılı olan sorgunun çıktısı şu şekilde olsun: 
+----+--------+ 
| id | name | 
+----+--------+ 
| 1 | java | 
| 2 | php | 
| 3 | linux | 
| 4 | java | 
| 5 | java | 
| 6 | ruby |
|  6   |  java   | 
+----+--------+
Tabloda gördüğünüz üzere 'java' ismi birden çok bulunmaktadır. Bu tablo hazırlanmadan önce eger programcı name isimli sütun için unique key i kullanmış olsaydı bu tip tekrarlı kayıtlar ile karşılaşılmayacaktı. O sorgu ise şu şekilde gerçekleştirilmektedir.  
ALTER TABLE names ADD CONSTRAINT name_ID UNIQUE (name)
Tekrarlı kayıt bulunan tabloda tekrarsız kayıtları çekmek için ise yazılması gereken sorgu şu şekilde olmalıdır:
SELECT DISTINCT name FROM names;
Yukarıda yazılı olan sorgunun çıktısı şu şekilde olsun: 
+------+ 
| name | 
+------+ 
| java | 
| php | 
| linux | 
| ruby | 
+-----+
Gördüğünüz gibi sadece çoklu kayıtların select sorgusunda çekilmemesi DISTINCT anahtar kelimesi ile gerçekleştirilmiştir.

Eğer duplicate yani tekrarlı kayıtların tablomuzdan tamamen silinmesini istiyorsak yazılması gereken sorgu ise şu şekildedir. Yazılan sorgulama sonrası yukarıdaki gibi name sütununda bulunan içerikler unique olarak listelenecektir:
DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
Gördüğünüz gibi herşey bu kadar basit. Tek satır sorgu ile çoklu kayıtlardan kurtulmuş oldunuz.

 

comments powered by Disqus