MySql Trigger – Basic by plug.in
Jun6
ใช้ 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 “;” ตามรูป
ในตัวอย่างเปลี่ยนเป็น ;; แทนครับ โดยถ้าหากเราต้องการสั่งให้ phpMyAdmin ทำงานหลายๆ Query พร้อมกันก็ให้ใส่ ;; แทน ; ครับ
Ref : http://dev.mysql.com/doc/refman/5.0/en/triggers.html
Enjoy this article?
Consider subscribing to our RSS feed!
16:56 on July 12th, 2009
สุดตรีนครับ
จะนำไปปฏิบัติ
12:45 on May 27th, 2010
ขอบคุณครับ กำลังงงเลย
11:52 on September 4th, 2010
จากที่นำมาเขียนโปรแกรมโปรเจคแล้ว ปรากฏว่าการใช้งานไม่ใช่เรื่องง่ายเรย พอจะมีความกระจ่างเรื่อง before กับ after มั้ยคะ รู้สึกว่ามันจะทำงานเหมือนกัน หรือถ้ามี link เอกสารอ่านเพิ่มเติมจะขอบคุณมากค่ะ
12:09 on September 4th, 2010
Before จะทำก่อนการทำการ Query นั้นๆครับ เช่น
CREATE TRIGGER trigger_name BEFORE UPDATE ON table …
หมายถึงทุกครั้ง “ก่อน” ที่เราจะ update อะไรก็ตาม Mysql จะมารัน Trigger ตัวนี้ ในทางกลับกันคือ AFTER คือ “หลัง”
ซึ่งความต่างจริงๆจะเกิดต่อเมื่อ เรามีการใช้ค่าที่เราเพิ่งได้อัพเดตเดี่ยวนั้นเลยหรือไม่ หรือเราต้องการใช้ค่าเก่า
ส่วนข้อมูลอ้างอิงดูได้จากเวป mysql โดยตรงเลยครับผม http://dev.mysql.com/doc/refman/5.0/en/triggers.html
10:28 on June 24th, 2011
การใช้งานควรศึกษาให้ดีเอาไปใช้แบบรอบคอบครับ(คุณสมบัติหลักของโปรแกรมเมอร์ที่ดีเลยนะครับ)
ข้อดีนั้นมีมากและน่าสนใจเมื่อใช้กับการทำงานในระดับข้อมูล ที่มีการinsert update delete บ่อยๆ
รวมถึงใช้ปรับปรุงการทำงานที่เดิมทีการเชื่อมโยงข้อมูลแต่ละ table ต้องใช้โปรแกรมยิงไปนู่นทีนี่ทีเพื่อให้ได้ข้อมูลที่ต้องการ ก็สามารถใช้ Trigger ในการช่วยเหลือและลดขั้นตอนการทำงานได้เยอะครับ
แต่ก็ต้องยอมรับว่าการ Debug อาจจะทำยากซักหน่อยเพราะเนื่องจากมันจะรันเมื่อเกิด event นั้นๆจะ before หรือ after ก็ตามซึ่งมันอยู่ในการทำงานของ Database ไม่มีหน้าจอ print ให้เรา Debug กันง่ายๆเหมือนเขียนโปรแกรมทั่วไป (แต่ทั้งนี้ทั้งนั้นมันก็ไม่เกินความสามารถของเราหรอกครับ เราก็สามารถหาวิธี design การ Debug ของเราเองได้ครับผมเชื่อว่าทุกคนทำได้^^)
ส่วนเรื่องของมาตรฐานนั้นผมคิดว่า อย่างไรก็ตามถ้าเราใช้ Mysql มันก็มีมาตรฐานกำหนดชัดเจนของมันอยู่แล้วครับ คิดให้ดี มันก็ไม่ต่างกัน ถ้าคุณใช้ MS-SQL syntax ต่างๆมันก็ไม่เหมือนกับใน Mysql อยู่แล้ว ^^”
04:44 on November 3rd, 2011
บทความมีประโยชน์มากเลยครับ ขอเซฟไปอ่านต่อนะครับ ขอบคุณครับ