MySql Trigger – Basic by

29
Jun
6

ใช้ 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

Enjoy this article?

Consider subscribing to our RSS feed!

6 ความเห็น

  1. kentreez
    16:56 on July 12th, 2009

    สุดตรีนครับ

    จะนำไปปฏิบัติ

  2. virgo
    12:45 on May 27th, 2010

    ขอบคุณครับ กำลังงงเลย

  3. kajub
    11:52 on September 4th, 2010

    จากที่นำมาเขียนโปรแกรมโปรเจคแล้ว ปรากฏว่าการใช้งานไม่ใช่เรื่องง่ายเรย พอจะมีความกระจ่างเรื่อง before กับ after มั้ยคะ รู้สึกว่ามันจะทำงานเหมือนกัน หรือถ้ามี link เอกสารอ่านเพิ่มเติมจะขอบคุณมากค่ะ

  4. plug.in
    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

  5. Nae
    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 อยู่แล้ว ^^”

  6. แก้วเซรามิค
    04:44 on November 3rd, 2011

    บทความมีประโยชน์มากเลยครับ ขอเซฟไปอ่านต่อนะครับ ขอบคุณครับ

ใส่ความเห็น

RSS feed for comments on this post

 เราชนะรอบ 4 | ยืมเงิน 3000 ด่วน | แอพกู้เงิน | แอพเงินด่วน | สินเชื่อออนไลน์อนุมัติทันที | Site Map | กู้เงินก้อน | กระเป๋าตัง | thisshop และ ยืมเงินฉุกเฉิน 5000 ด่วน