MySQL Çoklu Kayıt Silmek
Veritabanında bilgi tutarken her bilgiyi tek tabloda tutmayı değil de optimizasyon adına farklı tablolara böleriz. Örneğin, yurt çapında müşteri ağı olan bir firmanın müşteri tablosundaki şehir alanında ANKARA değil, 6 veya 06 yazmalıdır ki hem az yer kaplasın hem de integer değerler üzerinde indisleme yapsın. Bu durumda müşteri ağından bir şehri kaldırmak istediğimizde ya iki sorgu yapmamız gerekir, ya da ilişkilendirme yaparak tek sorgu. Hele bir de hangi şehirlerin kalktığını bilmiyorsak vay halimize...
En basitinden başlayalım. İki sorgu göndereceğiz mysqle. Bu iki sorgu çalışınca 6 id li şehirden kurtulmuş olacağız.
DELETE FROM sehirler WHERE sehirId=6; DELETE FROM musteriler WHERE sehirId=6;
Sorguyu direk mysql üzerinde çalıştırsak nasıl olur bilemiyorum ama PHP ile soergular gerçekleşirken mysql_query ile yoluyorsak komutları iki sorgu göndermek yerine hiç düşünmeden ilişkilendirilmiş sorgu yollamalıyız ki daha hızlı iletişim gerçekleşsin. MySql işleri hızlı yapsa da aradaki iletişim işi yavaşlatıyor. Bu durumda da şöyle bir kod kullanabiliriz
DELETE m, s FROM sehirler s, musteriler m WHERE m.sehirId=s.sehirId AND s.sehirId=6
Her iki yolla da işimizi görmüş olabilir lakin ilk yöntemi uygularken diyelim ki ankara şehri şehirler tablosundan silindi ama müşteriler daha silinmeden elektrikler gitti. Veya DBA lardan biri müşteriyi silmeyi unuttu. Şimdi ayıkla pirincin taşını....
Silinecek id yi bilmiyoruz, o yüzden üstteki sorguları kullanamıyoruz. Belki silinen 30 şehir var, belki firma dünya çapında olduğundan 500. Dolayısıyla sayarak bakarak işlem yapmak hem zor, hem de bize yakışmaz :) İşte bu durumda şuna benzer bir sorgu yazmamız lazım
DELETE m, s FROM sehirler s, musteriler m WHERE m.sehirId=s.sehirId AND s.sehirId=NULL
Eminim bu sorgu daha önce defalarca kez denenmiştir (e ben de deneyerek öğrenmiştim :) ) ama çalışmaz. Çalışması için mysql in kendi fonksiyonlarından olan EXISTS ten yararlanmamız gerekiyor. Yani NULL yerine NOT EXISTS kullanarak olmayan kayıtları o şekilde bulacağız. Çalışan sorgumuz son haliyle şu şekli alacak
DELETE FROM musteri WHERE NOT EXISTS(SELECT sehirId FROM sehirler WHERE sehirId =musteri.sehirId);
Bu sorgunun ardından, daha önce farkında olmadan sildiğimiz şehirlerin dahi müşterileri silinecektir. DELETE FROM yerine UPDATE SET kullanarak silinmiş şehirlerdeki müşterilerinizi diğer şehirlere kaydırabilirsiniz