Press "Enter" to skip to content

MYSQL Trigers (Tetikleyiciler)

Selahaddin Erdoğan 0

Bu yazımızda mysql triger kullanımı göreceğiz. Triger işlemini Opencart veri tabanı üzerinde gördüğüm bir eksiği tamamlayarak göstereceğim. Opencart veritabanında bir ürünün özelliğine (örneğin:Bir A ürününün 41 ,42 … numarasının her birine ait stok) ait stok bilgileri tutulurken bunlar ürüne ait toplam stoktan bağımsız olarak farklı tabloda tutuluyor.Örnek olarak bir A ürünün 41 numarasından  5 adet ,42 numarasından  4 adet  ve 43 numarasından  10  adet  ayakkabı olduğunu varsayalım. Ayakkabının toplam stoğu 19 olması gerekirken genel stok  daha farklı olabiliyor.  Şimdi bir Triger oluşturarak  yeni bir özellik   INSERT  ettikten sonra vaya  UPDATE  update yaptıktan sonra toplam stoğun otomotik olarak güncellenmesini sağlayacağız.

opencart   product tablosu sql kodu:

CREATE TABLE `product` (
 `product_id` int(11) NOT NULL,
 `model` varchar(64) NOT NULL,
 `sku` varchar(64) NOT NULL,
 `upc` varchar(12) NOT NULL,
 `ean` varchar(14) NOT NULL,
 `jan` varchar(13) NOT NULL,
 `isbn` varchar(17) NOT NULL,
 `mpn` varchar(64) NOT NULL,
 `location` varchar(128) NOT NULL,
 `quantity` int(4) NOT NULL DEFAULT '0',
 `stock_status_id` int(11) NOT NULL,
 `image` varchar(255) DEFAULT NULL,
 `manufacturer_id` int(11) NOT NULL,
 `shipping` tinyint(1) NOT NULL DEFAULT '1',
 `price` decimal(15,4) NOT NULL DEFAULT '0.0000',
 `points` int(8) NOT NULL DEFAULT '0',
 `tax_class_id` int(11) NOT NULL,
 `date_available` date NOT NULL DEFAULT '0000-00-00',
 `weight` decimal(15,8) NOT NULL DEFAULT '0.00000000',
 `weight_class_id` int(11) NOT NULL DEFAULT '0',
 `length` decimal(15,8) NOT NULL DEFAULT '0.00000000',
 `width` decimal(15,8) NOT NULL DEFAULT '0.00000000',
 `height` decimal(15,8) NOT NULL DEFAULT '0.00000000',
 `length_class_id` int(11) NOT NULL DEFAULT '0',
 `subtract` tinyint(1) NOT NULL DEFAULT '1',
 `minimum` int(11) NOT NULL DEFAULT '1',
 `sort_order` int(11) NOT NULL DEFAULT '0',
 `status` tinyint(1) NOT NULL DEFAULT '0',
 `viewed` int(5) NOT NULL DEFAULT '0',
 `date_added` datetime NOT NULL,
 `date_modified` datetime NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

product_option_value tablosu:

CREATE TABLE `product_option_value` (
 `product_option_value_id` int(11) NOT NULL,
 `product_option_id` int(11) NOT NULL,
 `product_id` int(11) NOT NULL,
 `option_id` int(11) NOT NULL,
 `option_value_id` int(11) NOT NULL,
 `quantity` int(3) NOT NULL,
 `subtract` tinyint(1) NOT NULL,
 `price` decimal(15,4) NOT NULL,
 `price_prefix` varchar(1) NOT NULL,
 `points` int(8) NOT NULL,
 `points_prefix` varchar(1) NOT NULL,
 `weight` decimal(15,8) NOT NULL,
 `weight_prefix` varchar(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

Burada amacımız ,  product_option_value   tablosuna  her ekleme ve güncelleme işlemlerinden sonra   product  tablosundaki quantity değeri ile  product_option_value  quantity    değerlerini   ilişkili bir şekilde güncel tutmaktır.

Her güncelleme yapıldıktan sonra toplam stoğu güncelleyecek TRIGER:

DELIMITER $$
CREATE TRIGGER product_stock_update AFTER UPDATE ON product_option_value 
 FOR EACH ROW
 BEGIN
 UPDATE product SET quantity=(SELECT SUM(quantity) FROM product_option_value WHERE product_id=OLD.product_id) WHERE product_id=OLD.product_id;
END$$
DELIMITER ;

 

Her yeni kayıt eklendikten sonra toplam stoğu güncelleyecek TRIGER:

DELIMITER $$
CREATE TRIGGER product_stock_insert AFTER INSERT ON product_option_value 
 FOR EACH ROW
 BEGIN
 UPDATE product SET quantity=(SELECT SUM(quantity) FROM product_option_value WHERE product_id=NEW.product_id) WHERE product_id=NEW.product_id;
END$$
DELIMITER ;

 

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir