LevelUp! Studio » phpMyAdmin https://blog.levelup.in.th Experience the new world. Fri, 26 May 2017 10:06:07 +0000 th hourly 1 http://wordpress.org/?v=3.8.1 MySql Trigger – Basic https://blog.levelup.in.th/2009/06/29/mysql-trigger-basicmysql-trigger-basic/ https://blog.levelup.in.th/2009/06/29/mysql-trigger-basicmysql-trigger-basic/#comments Mon, 29 Jun 2009 10:03:21 +0000 http://blog.levelup.in.th/?p=63 ใช้ Mysql มาตั้งนาน แต่เพิ่งจะเคยของใช้ Trigger ใน Mysql ดู (เนื่องด้วยความจำเป็น) ว่าแล้วก็มาเขียนแชร์ไว้หล่ะกัน

Trigger คืออะไร?

Trigger คือการแทรกการกระทำ (Method/Function) ลงไว้ใน Database โดยสามารถใส่เงื่อนไขต่างๆได้เหมือนกับภาษาโปรแกรมทั่วไปครับ โดยเมื่อเกิด Query ใน Mysql แล้วตัว Database จะทำการไล่ Check ว่ามี Trigger ไหนตรงตามเงื่อนไขบ้าง และเรียกใช้งาน

ทำไมต้อง Trigger

การใช้ Trigger เป็นเหมือนดาบสองคม มีทั้งข้อดีแล้วข้อเสียครับ จะแจกแจงคร่าวๆเท่าที่พอนึกออกไว้ให้ครับ

+ ดูดีมีชาติตระกูล เร็ว (เร็วกว่าที่ส่งข้อมูลไปๆมาๆระหว่าง Mysql กับ Php/Server-side script อื่นๆ)

+ ทำบางอย่างที่ทำด้วยโค้ด Server-side script มาตราฐานไม่ได้ หรือไม่สะดวกนัก โดยการ Hook เข้าไปในระบบของ DB เลย

- Debug ยาก ยิ่งมีภาษาเพิ่มเข้ามาอีก ยิ่งเพิ่มความปวดหัว

- ยึดติดกับ Platform เนื่องจาก Trigger ไม่มีมาตราฐานชัดเจน ทำให้เมื่อย้ายไปใช้ตัวอื่นจะต้องศึกษาใหม่

Replacement

จริงๆ ในหลายๆกรณีก็ไม่จำเป็นต้องใช้ Trigger เช่นการ Update Table ที่เป็น Foreign key โดยสามารถใช้คำสั่ง Cascade ช่วยได้

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

Mysql Trigger พื้นฐาน

หน้าตาตัวอย่าง Trigger

CREATE TRIGGER trigger_name BEFORE UPDATE ON table_name
FOR EACH ROW BEGIN
IF NEW.dirty=0 OR NEW.dirty=1 THEN
SET NEW.dirty=1;
ELSE
SET NEW.dirty=0;
END IF;
END;

  • CREATE TRIGGER trigger_name คำสั่งสร้าง Trigger
  • BEFORE UPDATE Event หลักๆที่เราสามารถ Hook trigger ของเราเข้าไปได้ ได้แก่ INSERT, UPDATE, DELETE โดยสามารถเลือกว่าจะทำการ Hook ก่อนหรือหลัง (BEFORE / AFTER) Query เหล่านั้นได้
  • ON table_name เลือก Table ที่ต้องการให้ Trigger ทำงาน
  • FOR EACH ROW BEGIN ทำการ Loop ด้วย ROW (Keyword ROW หมายถึงข้อมูลที่เพิ่ม/แก้ไข/ลบ ขึ้นอยู่กับชนิด Query)
  • IF NEW.dirty=0 OR NEW.dirty=1 THEN Keyword NEW หมายถึง ข้อมูลของแถวที่กำลังจะเปลี่ยนแปลงหรือมีการเปลี่ยนแปลงไปแล้ว (ขึ้นกับว่าเป็น BEFORE หรือ AFTER Trigger) โดยจะมีอีก Keyword คือ OLD จะหมายถึงข้อมูลเก่าก่อนที่จะเกิดการรัน Query นั้นๆ
  • SET NEW.dirty=1; ทำการเปลี่ยนแปลงค่า โดยจะเปลียนได้เฉพาะตัวแปร NEW (OLD จะไม่สามารถเปลี่ยนแปลงได้)
  • นอกจากนี้ยังสามารถแทรก Query มาตราฐาน (INSERT,UPDATE,DELETE และอื่นๆ) ลงใน Trigger ได้เลยอีกด้วย ซึ่งเราสามารถนำตัวแปร ROW,OLD,NEW มาใช้งานได้เช่นกัน

สร้าง Trigger บน phpMyAdmin

ถ้าได้ลองเอาโค้ดตัวอย่างไปลอง Run ใน phpMyAdmin จะพบว่าไม่สามารถทำงานได้ ด้วย Error ที่อ่านไม่ค่อยจะเข้าใจนัก

เหตุผลphpMyAdmin ไม่สามารถ Run คำสั่งนี้ได้ เนื่องจากเกิดการสับสนเรื่อง Delimiter ของ Mysql กับ คำสั่งใน Trigger

วิธีการแก้ไข แก้ได้ด้วยการ เปลี่ยน Delimiter เป็นตัวอักษรอื่นแทน semicolon “;” ตามรูป

เปลี่ยน Delimiter ใน phpMyAdmin

ในตัวอย่างเปลี่ยนเป็น ;; แทนครับ โดยถ้าหากเราต้องการสั่งให้ phpMyAdmin ทำงานหลายๆ Query พร้อมกันก็ให้ใส่ ;; แทน ; ครับ

Ref : http://dev.mysql.com/doc/refman/5.0/en/triggers.html

]]>
https://blog.levelup.in.th/2009/06/29/mysql-trigger-basicmysql-trigger-basic/feed/ 6