Tablolardaki kopya sorunları, SQL'in en eski problemlerinden biridir ve özellikle internet hizmetlerinin kitlesel büyümesi ve büyük veri göçleri ile daha da önem kazanmaktadır. Başlangıçta problem manuel olarak çözülüyordu: kopyaları belirli scriptlerle bulup siliyorlardı, ama verilerin büyümesiyle bu yaklaşım etkisiz hale geldi.
Problem: Dikkatsiz yükleme, göç veya hatalar sırasında, genellikle aynı anahtar özelliklere (örneğin, email veya kimlik) sahip on binlerce satır oluşmaktadır. Bu, entegrasyonlarda hatalara, yanlış analize ve müşteri güveninin kaybına yol açar.
Çözüm: Kopya raporlarını gruplama ve pencere fonksiyonları ile oluşturmak; bir "doğru" kaydı saklayarak kopya kayıtları silmek; anahtar alanlar için UNIQUE kısıtlamaları eklemek ve düzenli denetimler yapmak.
Örnek kod
WITH Duplicates AS ( SELECT email, COUNT(*) AS cnt FROM users GROUP BY email HAVING COUNT(*) > 1 ) SELECT u.* FROM users u JOIN Duplicates d ON u.email = d.email ORDER BY u.email, u.id;
Kopyaları silme (en düşük id'ye sahip satırı bırakmak):
DELETE FROM users WHERE id NOT IN ( SELECT MIN(id) FROM users GROUP BY email );
Anahtar özellikler:
Kopyaları tablo üzerinden silmek için DISTINCT kullanılabilir mi?
Hayır, DISTINCT yalnızca seçim (SELECT) için çalışır, tablo satırlarını silmez. Silmek için DELETE veya DISTINCT ile yeni bir temiz tablo oluşturmak için INSERT ... SELECT kullanmak gerekir.
DELETE ... WHERE id NOT IN (SELECT MIN(id) ...) komutu tüm kopyaları garantili olarak siler mi?
Hayır, eğer anahtar sütununda NULL varsa, bu sorgu NULL değer karşılaştırmalarının özellikleri nedeniyle hatalı bir şekilde kopyaları bırakabilir.
Artık kopya olmaması için UNIQUE INDEX oluşturmak yeterli mi?
Hayır, indeks yalnızca yeni kopya eklemeye karşı koruma sağlar, mevcut tablo tekrarlarını etkilemez.
CRM sistemi, email benzersizliğini dikkate almadan farklı kaynaklardan kullanıcıları kopyalar, veritabanında 50000 kopya vardır. Kütlevi UNIQUE indeks ekleme girişimi başarısız olur, servis durur.
Artıları:
Eksileri:
Mühendis, özel raporlar aracılığıyla kopyaları düzenli olarak analiz eder, veritabanını temizler, benzersiz indeksler oluşturur. Yeni veri göçü öncesinde doğrulama yapar.
Artıları:
Eksileri: