Trigger เป็นฟีเจอร์สำคัญของ MySQL ที่ช่วยให้ระบบสามารถทำงานอัตโนมัติได้ทันทีเมื่อเกิดเหตุการณ์บางอย่าง เช่น การเพิ่ม แก้ไข หรือลบข้อมูลในตาราง โดยไม่ต้องเรียกใช้คำสั่งจากโปรแกรมหรือแอปพลิเคชันภายนอกให้ยุ่งยาก
โครงสร้างพื้นฐานของคำสั่ง CREATE TRIGGER
SQL
CREATE TRIGGER trigger_name
[BEFORE | AFTER] [INSERT | UPDATE | DELETE]
ON table_name
FOR EACH ROW
BEGIN
-- คำสั่ง SQL ที่ต้องการให้ทำงานอัตโนมัติ
END;| ส่วนของคำสั่ง | ความหมาย |
|---|---|
CREATE TRIGGER | สร้าง Trigger |
trigger_name | ตั้งชื่อ Trigger |
BEFORE หรือ AFTER | จะให้ทำงาน “ก่อน” หรือ “หลัง” เหตุการณ์เกิดขึ้น |
INSERT, UPDATE, DELETE | เหตุการณ์ที่ต้องการดักจับ |
ON table_name | ตารางที่ต้องการให้ Trigger เฝ้าดู |
FOR EACH ROW | ทำงานกับทุกแถวที่ได้รับผลกระทบ |
NEW, OLD | ใช้เข้าถึงค่าข้อมูลที่เพิ่งถูก INSERT (NEW) หรือ ก่อน/หลังถูก UPDATE, DELETE (OLD) |
ตัวอย่างการใช้งาน
บันทึกการเพิ่มลูกค้าใหม่ลงใน log
สมมติว่าเรามีตาราง customers และ customer_log
เมื่อมีการเพิ่มข้อมูลลงใน customers, ให้ระบบบันทึกข้อความว่า “เพิ่มลูกค้า: [ชื่อ]” ลงในตาราง customer_log
สร้าง Trigger
SQL
DELIMITER //
CREATE TRIGGER after_customer_insert
AFTER INSERT ON customers -- ทำงานหลังจากมีการ INSERT ลงตาราง customers
FOR EACH ROW -- ทำงานกับทุกแถวที่ถูกเพิ่ม
BEGIN
-- แทรกข้อความ log ลงในตาราง customer_log
INSERT INTO customer_log(message, log_time)
VALUES (
CONCAT('เพิ่มลูกค้า: ', NEW.name), -- ใช้ค่า NEW.name คือชื่อที่เพิ่งถูกเพิ่มเข้ามา
NOW() -- บันทึกเวลาปัจจุบัน
);
END //
DELIMITER ;ทดสอบใช้งาน Trigger
SQL
INSERT INTO customers(name, email)
VALUES ('กาญจนา', '[email protected]');ผลลัพธ์
| id | message | log_time |
|---|---|---|
| 1 | เพิ่มลูกค้า: กาญจนา | 2024-04-12 14:30:00 |
ข้อควรระวังในการใช้งาน Trigger
- MySQL ไม่รองรับ Trigger ซ้อนกันหลายชั้น (Nested)
- อย่าทำให้ Trigger ทำงานหนักเกินไป เช่น query ซับซ้อนหรือวนลูป
- หลีกเลี่ยง
UPDATEตารางเดียวกันใน Trigger เดียวกัน (อาจเกิด loop infinity) - หากต้องการใช้กับหลายตาราง ควรแยก Trigger แต่ละตารางอย่างชัดเจน