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.

SQL kodu
  1. DELETE FROM sehirler WHERE sehirId=6;
  2. 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

SQL kodu
  1. DELETE m, s FROM sehirler s, musteriler m
  2. 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

HATALI SQL kodu
    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

SQL kodu
  1. DELETE FROM musteri
  2. WHERE
  3. 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

MySQL Çoklu Kayıt Silmek Oy Sayısı: 13 Puan: 9.31/ 10.00

Etiketler

mysql coklu silme , mysql iki tablodan birden coklu silmek , php mysql coklu silme , mysql coklu kayit , php coklu kayit silme , mysql ayni kayitlari silme , mysql tabladaki kayitlari silmek , php coklu silme , php coklu kayit , php toplu kayit silme ,

Ercan Yaman22 Nisan 2011 Cuma 15:47:26


not exists olayını hiç bilmiyordum, bu komuttan sonra insert update ve delete üçlüsüyle yetinmemeye karar verdim. Teşekkür ederim.


Metin Seylan01 Mayıs 2011 Pazar 04:27:33


çok güzel anlatım olmuş gündüz abi işime yaradı


ali emir gürbüz30 Mayıs 2011 Pazartesi 05:21:26


şimdi hoocam bu left joinle birleştirdigimiz benzer alanlı tablolar icin tek seferde iki tablodaki verileride silme olarak geçiyor degil mi...yani not exists güzelmiş cidden kullanmam lazım :)


Gündüz Can YILMAZ01 Haziran 2011 Çarşamba 12:42:14


Evet kardeşim onları siliyor :)


Metin Seylan27 Haziran 2011 Pazartesi 16:28:50


yazılarının devamını bekliyoruz gündüz abi


Gündüz Can YILMAZ28 Haziran 2011 Salı 06:50:40


İnşallah kardeşim KPSS geçsin de bir :)




Yorumunuz