หลายท่านคงจะเคยเขียนคำสั่ง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;
ไม่มีความคิดเห็น :
แสดงความคิดเห็น