Başlıktan da anlaşılabileceği gibi, bugün sizlere MySQL veritabanlarında sıkça karşılaşılan bir sorunu çözmek için bir SQL sorgusu paylaşacağım.
Konuyu bir örnekle anlatırsam daha sağlıklı olur diye düşünüyorum. Örneğin, users adında bir tablomuz olsun ve bu tabloda tc kimlik numaralarını tuttuğumuz bir sütun olsun, bu sütunun adı da “civilization_number” olsun. “users” adlı tabloda binlerce kayıt olduğunu varsayalım ve “civilization_number” sütunu mükerrer olan kayıtların tespit edilip, id değeri en küçük olan hariç silinmesini sağlayalım. Çünkü hepsini silersek mükerrer kayıtları temizlerken asıl kaydı da silmiş oluruz.
İlk olarak, sorunun çözümü için kullanacağımız SQL sorgusuna göz atalım:
DELETE FROM users WHERE id NOT IN (SELECT * FROM (SELECT MIN(id) FROM users GROUP BY civilization_number HAVING COUNT(*) > 1) AS t) AND civilization_number IN (SELECT * FROM (SELECT civilization_number FROM users GROUP BY civilization_number HAVING COUNT(*) > 1) AS t2);
Bu sorgu, oldukça karmaşık gibi görünse de, sorunu basit bir şekilde çözmek için tasarlanmıştır. İsterseniz, sorgunun her bir parçasını ayrı ayrı ele alarak nasıl çalıştığını inceleyebiliriz.
İlk olarak, “users” tablosundaki kayıtların “civilization_number” sütunu mükerrer olanlarının belirlenmesi gerekiyor. Bu amaçla, aşağıdaki sorguyu kullanabiliriz:
SELECT civilization_number, COUNT(*) FROM users GROUP BY civilization_number HAVING COUNT(*) > 1;
Bu sorgu, “civilization_number” sütunu mükerrer olan kayıtların sayısını ve değerlerini listeleyecektir. Ancak, bu sorgu bize mükerrer olan kayıtların id değerlerini vermez. Bu sorunu çözmek için, “id” sütununu da eklememiz gerekiyor:
SELECT civilization_number, MIN(id), COUNT(*) FROM users GROUP BY civilization_number HAVING COUNT(*) > 1;
Bu sorgu, “civilization_number” sütunu mükerrer olan kayıtların id değerlerini ve sayılarını listeleyecektir. Ancak, burada bize sadece id değerleri lazım olduğu için, “MIN(id)” fonksiyonunu kullanarak en küçük id değerini seçiyoruz.
Şimdi, bu sorguyu bir alt sorgu olarak kullanarak, silinecek kayıtları belirleyebiliriz. İşte tam da bu noktada, yukarıda paylaştığım uzun SQL sorgusu devreye giriyor. Bu sorgu, “civilization_number” sütunu mükerrer olan kayıtların tamamını belirleyecek ve her “civilization_number” grubunda en küçük “id” değerine sahip olan kaydı hariç tutacaktır. Sonrasında, geri kalan tüm kayıtları silecektir.
Bu senaryoyu isteğinize ya da ihtiyacınıza göre değiştirerek kullanabilirsiniz. Ancak şunu da unutmayın:
Bu yaptığımız işlem özellikle büyük veri tabanları için çok yavaş ve yoğun kaynak tüketecek bir işlem olduğundan, işlemi gerçekleştirmeden önce bir yedek alma işlemi yapmanız ve sorguyu test etmenizi kesinlikle öneririm.
Bir cevap yazın