การใช้งาน 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;

ความคิดเห็น
แสดงความคิดเห็น