วันศุกร์ที่ 20 กันยายน พ.ศ. 2556

การใช้งาน TRIGGER ใน MySQL


     หลายท่านคงจะเคยเขียนคำสั่งExecuteกับฐานข้อมูลหลายๆเทเบิลในเวลาเดียวกัน เช่น Insert เสร็จ แล้วดึงค่า id ล่าสุดไปใส่อีกเทเบิลนึงที่สัมพันธ์กัน ซึ่งมันจะทำงานซ้ำๆกันอย่างนี้ทุกครั้ง ความจริงแล้วเราสามารถกำหนดการทำงานแบบนี้ได้ 2 วิธี คือ

1.กำหนดการทำงานที่ Code PHP ได้เลย คือ เพิ่มเสร็จแล้วเขียนคำสั่งดึงค่า id ล่าสุด
(mysql_insert_id()) ออกมา แล้วเขียนคำสั่งเพิ่มลงไปในเทเบิลอื่นอีกครั้ง จะเห็นได้ว่ามันมีหลายขั้นตอนเกินไปและค่อนข้างยุ่งยากพอสมควร

2.การเขียน Trigger โดยเจ้าTriggerนี้จะทำงานที่ตัว MySQL เลยครับ ไม่ต้องเขียนโค๊ด PHP หลายขั้นตอนให้เหนื่อย
Codeก็เขียนง่ายแสนง่าย เช่น

วิธีสร้าง Trigger

CREATE TRIGGER after_insert_product
   AFTER INSERT ON  product FOR EACH ROW
    BEGIN
      UPDATE category
      SET category_pd_count= (NEW.category_pd_count+1)
      WHERE category_id = NEW.category_id;
END

     จากคำสั่งด้านบน อธิบายได้แว่ เอ้ย ว่า Trigger ตัวนี้มีชื่อว่า after_insert_product ทำงานหลังจากเพิ่มสินค้าลงเทเบิล product ให้มันไปบวกจำนวนสินค้า(category_pd_count)ในเทเบิล category เพิ่มอีก 1 โดยมีเงื่อนไขว่า category_id ของเทเบิล category เท่ากับ category_id ของเทเบิล product ที่เพิ่มไปล่าสุดเท่านั้น (NEW.category_id)

คำสั่งแสดงชื่อ TRIGGER ที่เราได้สร้าง

SHOW TRIGGERS;->แสดงทั้งหมด
SHOW TRIGGERS LIKE 'ins%';->ค้นหาtriggerที่ขึ้นต้นด้วย ins

ถ้าเราจะต้องการลบการทำงานของ Trigger ชื่อ after_insert_product ก็แค่ใช้คำสั่ง

DROP TRIGGER IF  EXISTS after_insert_product ;

มาดูคำสั่งอื่นๆที่ผมรวบรวมมาครับ

1.ทำงานก่อนลบเทเบิล trigger_carts ให้ไปลบข้อมูลในเทเบิล trigger_cart_items ก่อน

CREATE TRIGGER `tutorial`.`before_delete_carts`
    BEFORE DELETE ON `trigger_carts` FOR EACH ROW
    BEGIN
        DELETE FROM trigger_cart_items WHERE OLD.cart_id = cart_id;
 END

2.แก้ไขข้อมูลในเทเบิล trigger_items หลังจากที่แก้ไขข้อมูลในเทเบิล trigger_items_cost เสร็จแล้ว

CREATE TRIGGER `after_update_cost`
        AFTER UPDATE ON `trigger_items_cost` FOR EACH ROW
        BEGIN
           UPDATE trigger_items
           SET price = (NEW.cost * 1.3)
           WHERE item_id = NEW.item_id;
        END 

3.แก้ไขข้อมูลแบบมีเงื่อนไข

CREATE TRIGGER `before_update_cost`
    BEFORE UPDATE ON `trigger_items_cost` FOR EACH ROW
    BEGIN
        IF NEW.cost < 50 THEN
            SET NEW.cost = 50;
        ELSEIF NEW.cost > 50 AND NEW.cost < 100 THEN
            SET NEW.cost = 100;
        END IF;
    END

4.แก้ไขข้อมูลในเทเบิล tb_parts แล้วไปอัพเดทข้อมูลที่ tb_product ด้วย โดยที่แก้ไขเฉพาะฟิลด์ที่ id_parts ตรงกัน

CREATE TRIGGER `after_update_cost`
        AFTER UPDATE ON `tb_parts` FOR EACH ROW
        BEGIN
           UPDATE tb_product
           SET brand_pd= NEW.name_parts
           WHERE id_parts =NEW. id_parts;
        END  

5.นับจำนวนแถวที่อัพเดทแล้วเอาข้อมูลไปเก็บไว้ในเทเบิล tb_catemain

CREATE TRIGGER `after_update_product`
AFTER DELETE ON `tb_product` FOR EACH ROW
BEGIN
Set @CountRows=(SELECT  count(id_pd)
 from tb_product
 where id_cate =OLD.id_cate);
UPDATE tb_catemain
SET TotalRec=@CountRows
WHERE id_cate=OLD.id_cate;
END

    ตัวอย่างคำสั่งที่ 5 จะเห็นความพิเศษตรงคำสั่ง Set @CountRows=(SELECT count(id_pd) from tb_product where id_cate =OLD.id_cate); Set @CountRows คือการกำหนดชื่อตัวแปรให้รับค่าจากคำสั่ง SELECT count(id_pd) from tb_product where id_cate =OLD.id_cate; แล้วนำตัวแปรชื่อ @CountRows ไปอัพเดทด้วยคำสั่ง UPDATE tb_catemain SET TotalRec=@CountRows WHERE id_cate=OLD.id_cate;

1 ความคิดเห็น :