เมื่อเราสร้าง Trigger ใน MySQL เราจะต้องเลือกว่าจะให้ Trigger ทำงาน ก่อน (BEFORE) หรือ หลัง (AFTER) เหตุการณ์นั้นเกิดขึ้น
| ประเภท | ทำงานเมื่อ… | ใช้สำหรับ… |
|---|---|---|
BEFORE | ก่อนข้อมูลจะถูกเขียนลงตาราง | แก้ไข/ตรวจสอบข้อมูล ก่อนบันทึกจริง |
AFTER | หลังข้อมูลถูกเขียนเสร็จแล้ว | บันทึก log, อัปเดตตารางอื่น, แจ้งเตือน |
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1 BEFORE INSERT เติมค่าหากไม่ได้ระบุ
ถ้าผู้ใช้งานไม่ได้ใส่ชื่อ ระบบจะตั้งชื่อเป็น “ไม่ระบุชื่อ” ให้อัตโนมัติ ก่อนเพิ่มข้อมูล
สร้าง Trigger
SQL
DELIMITER //
CREATE TRIGGER before_user_insert
BEFORE INSERT ON users -- ทำงานก่อน INSERT
FOR EACH ROW
BEGIN
-- ถ้า name ที่จะถูกใส่มีค่าเป็น NULL หรือว่าง
IF NEW.name IS NULL OR NEW.name = '' THEN
SET NEW.name = 'ไม่ระบุชื่อ'; -- กำหนดค่า default ให้ก่อนบันทึก
END IF;
END //
DELIMITER ;ทดสอบ Insert ข้อมูล
SQL
INSERT INTO users(name) VALUES (NULL);ผลลัพธ์
| id | name |
|---|---|
| 1 | ไม่ระบุชื่อ |
ตัวอย่างที่ 2 AFTER INSERT → บันทึก log เมื่อมีการเพิ่มข้อมูล
เมื่อมีผู้ใช้งานใหม่ถูกเพิ่ม ให้บันทึกข้อความ “เพิ่มผู้ใช้: [ชื่อ]” ลงในตาราง user_log
สร้าง Trigger
SQL
DELIMITER //
CREATE TRIGGER after_user_insert
AFTER INSERT ON users -- ทำงานหลัง INSERT สำเร็จ
FOR EACH ROW
BEGIN
INSERT INTO user_log(message, log_time)
VALUES (
CONCAT('เพิ่มผู้ใช้: ', NEW.name), -- ใช้ NEW.name เพราะข้อมูลถูกเพิ่มแล้ว
NOW() -- เวลาปัจจุบัน
);
END //
DELIMITER ;ทดสอบ Insert ข้อมูล
SQL
INSERT INTO users(name) VALUES ('กิติพงษ์');ผลลัพธ์
| id | message | log_time |
|---|---|---|
| 1 | เพิ่มผู้ใช้: กิติพงษ์ | 2025-04-13 21:48:00 |
สรุปเปรียบเทียบ BEFORE vs AFTER Trigger
| จุดเปรียบเทียบ | BEFORE Trigger | AFTER Trigger |
|---|---|---|
| เวลาที่ทำงาน | ก่อนคำสั่ง INSERT/UPDATE/DELETE | หลังคำสั่ง INSERT/UPDATE/DELETE |
| เหมาะสำหรับ | ตรวจสอบ / แก้ไขข้อมูลก่อนบันทึก | บันทึก log / อัปเดตตารางอื่น |
ใช้ NEW / OLD ได้ | ใช้ NEW (INSERT/UPDATE) | ใช้ NEW / OLD ได้ทุกกรณี |
| การยกเลิกการทำงาน | ทำได้ง่ายผ่าน SET NEW.column | ต้องใช้ logic เพิ่มในการควบคุม |