Press "Enter" to skip to content

MYSQL Trigers (Tetikleyiciler)

Selahaddin Erdoğan 2

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 ;

 

 

  1. Yunus Emre Polat Yunus Emre Polat

    Selahaddin bey merhaba, paylaşımınız için teşekkürler.

    Benim de benzer bir işlem yaptırmam lazım lakin beceremedim. Amacım ürün tablomdaki stok ve fiyat değişince ikisinin çarpımı olan toplam tutar kısmını güncellemek.

    tablo adı: yep_products
    stok kolon adı : products_stock
    fiyat kolon adı : products_sales_price
    toplam tutar kolon adı : products_total_sales

    ben bu şekilde yaptım lakin bir türlü olmadı ;

    DELIMITER $$
    CREATE TRIGGER tutar_update AFTER UPDATE ON yep_products
    FOR EACH ROW BEGIN
    UPDATE yep_products SET products_total_sales = products_stock * products_sales_price WHERE products_id;
    END$$

    DELIMITER ;

    • Selahaddin Erdoğan Selahaddin Erdoğan

      Merhaba Yunus Bey,

      Yazmış olduğunuz Sql kodunun UPDATE yep_products SET products_total_sales = products_stock * products_sales_price WHERE products_id; Satırında WHERE şartında sonra yazmış olduğunuz products_id ifadesinden kaynaklandığını düşünüyorum. Şartlı ifadeyi birde, WHERE product_id=OLD.product_id; şeklinde güncelleyip denemenizi rica ediyorum. Sorununuz çözülmez ise Opencart versiyonunuzu bana iletirseniz yardımcı olmaya çalışayım.

Bir cevap yazın