MySQL'de Trigger Kullanımı
Merhaba,
Bu yazımda mysql de trigger kullanımından bahsedeceğim.
Aslında nasıl anlatacağıma tam karar veremedim. Sanırım en iyisi bir örnek üzerinden anlatmak olacak.
Diyelim ki büyük bir sistem kodluyorsunuz. Bu sistem içinde arama diye bir kısım var.
Bu arama işlemi çok farklı sonuçlar getirecek. Farklı tablolardan farklı içerikleri alarak kullanıcıya gösterecek.
Bu işlem için UNION kullanılabilir. Fakat tablo sayısı ve içerik artmaya başladıktan sonra sorguda bir yavaşlama olacaktır.
Düşünsenize 5 - 6 adet tablodan UNION ile veri çekiyorsunuz.
Bu çok mantıklı bir çözüm yolu gelmiyor.
Sanırım burada yapılabilecek en iyi şey yeni bir tablo oluşturmak ve arama işleminde kullanacağız tablolardaki her CRUD işleminden sonra bir TRIGGER ile bu tabloya aktarmak.
Biraz karışık gelmiş olabilir. Hemen basit bir örnek ile detaylandıralım.
- Haberleri tuttuğumuz bir tablomuz olsun.
- Haberler tablomuzda, haber_id, haber_baslik, haber_link gibi sütunlarımız bulunsun
- Arama işlemi yapmak için ise
- arama adında başka bir tablo oluşturalım.
- arama_id, arama_haber_id, arama_haber_baslik, arama_haber_link gibi sütunlara sahip olsun.
Şimdi gelelim en güzel kısma. Biz bir haber eklediğimiz zaman otomatik olarak arama tablosuna da eklenmesini isteyelim. Yazacağımız trigger aşağıdaki gibidir.
DELIMITER $$
CREATE TRIGGER haber_ekle_triggerAFTER INSERT ON haberler
FOR EACH ROW
BEGIN
INSERT INTO aramaSET arama_haber_id = NEW.haber_id,
arama_haber_baslik = NEW.haber_baslik,
arama_haber_link = NEW.haber_link;
END$$;DELIMITER ;
Şimdi yukarıdaki kodları biraz açalım.
Mysql'de trigger oluşturmak için DELIMITER yazıp ardından bir boşluk bırakıp $$ işaretlerini yazıyoruz. Aslıdan burada başlangıcımızı belirtiyoruz.
Ardından CREATE TRIGGER ile haber_ekle_trigger adında bir trigger oluşturuyoruz.
AFTER INSERT ON haberler satırı ile haberler tablosuna her insert yapıldığında komutunu veriyoruz.
FOR EACH ROW adından da anlaşılabileceği gibi her bir satır için
BEGIN ile başlıyoruz.
INSERT INTO arama
SET arama_haber_id = NEW.haber_id,
arama_haber_baslik = NEW.haber_baslik,
arama_haber_link = NEW.haber_link;
arama tablosuna, eleman ekleme işlemi gerçekleştiriyoruz.
Buradaki NEW parametresi, adından da anlaşılacağı üzere haberler tablosuna her yeni eklemedeki değerleri işaret eder. Yeni haber_id 'yi arama_haber_id'ye atıyoruz mesela..
Sanırım anlaşılmıştır.
----------------------------------------------------------------------
Geçelim güncelleme işlemine. Diyelim ki haberler tablosundaki içerik güncellendi. O zaman ne yapacağız. Bir trigger ile bu işi çözeriz aslında. :)
DELIMITER $$
CREATE TRIGGER haber_guncelle_trigger
AFTER UPDATE ON haberlerFOR EACH ROW
BEGIN
IF
NEW.haber_baslik != OLD.haber_baslik OR NEW.haber_link != OLD.haber_link
THEN
UPDATE arama SETarama_haber_baslik = NEW.haber_baslik,
arama_haber_link = NEW.haber_link
WHERE
arama_haber_id = OLD.haber_id;
END IF;
END$$;
DELIMITER ;
Şimdi gelelim yukarıdaki kodları açıklamaya.
Zaten IF ifadesine kadar anlamışsınızdır diye tahmin ediyorum. haber_guncelle_trigger adında bir trigger oluşturuyoruz. Ne zaman? haberler tablosu her UPDATE olduğunda.
Şimdi karışık gelecek kısım IF içerisi olabilir. Aslında o da basit.
NEW ile OLD 'u anlatmaya gerek yoktur sanırım. Eski başlık ile yeni başlık ve eski haber linki ile yeni haber linki karşılaştırılıyor.
Bunlardan birtanesi bile aynı değil ise arama tablomuzu güncelliyoruz.
----------------------------------------------------------------------
Şimdi gelelim silmeye. Sistemi yöneticek kişi haberi silmiş olabilir. Biz aramalarda bu haberi gösterirsek olmaz değil mi? Eğer düzgün kod yazdıysak devamlı 404 NOT FOUND hatasına düşeriz ( ! )
O zaman başlayalım silme işlemi için bir trigger yazmaya.
DELIMITER $$
CREATE TRIGGER haber_sil_triggerAFTER DELETE on haberler
FOR EACH ROW
BEGIN
DELETE FROM arama WHERE arama_haber_id = OLD.haber_id;
END$$;
DELIMITER ;
Sanırım kod kendini anlatıyor.
Bir trigger tanımlıyoruz. haberler tablosundan her bir içerik silindikten "sonra", arama tablosundan da bu içeriği siliyoruz.
Bu arada belirtmeden geçmeyeyim. Ben bu işlemleri haberler tablosunda yapılması gerekenleri yaptıktan sonra arama tablosuna aktarıyorum. Siz isterseniz habler tablosunda işlem yapmadan hemen önce de yaptırabilirsiniz.
Bunun için kullanmanız gereken sözcük BEFORE :))
Mesela silme işlemini örnek olarak yazalım.
DELIMITER $$
CREATE TRIGGER haber_sil_triggerBEFORE DELETE on haberler
FOR EACH ROW
BEGIN
DELETE FROM arama WHERE arama_haber_id = OLD.haber_id;
END$$;
DELIMITER ;
Evet, hepsi bu kadar.
Ben kaçar..
1 yorum yapılmış