MySQL ความแตกต่างระหว่าง BEFORE กับ AFTER Trigger

เมื่อเราสร้าง 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);

ผลลัพธ์

idname
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 ('กิติพงษ์');

ผลลัพธ์

idmessagelog_time
1เพิ่มผู้ใช้: กิติพงษ์2025-04-13 21:48:00

สรุปเปรียบเทียบ BEFORE vs AFTER Trigger

จุดเปรียบเทียบBEFORE TriggerAFTER Trigger
เวลาที่ทำงานก่อนคำสั่ง INSERT/UPDATE/DELETEหลังคำสั่ง INSERT/UPDATE/DELETE
เหมาะสำหรับตรวจสอบ / แก้ไขข้อมูลก่อนบันทึกบันทึก log / อัปเดตตารางอื่น
ใช้ NEW / OLD ได้ใช้ NEW (INSERT/UPDATE)ใช้ NEW / OLD ได้ทุกกรณี
การยกเลิกการทำงานทำได้ง่ายผ่าน SET NEW.columnต้องใช้ logic เพิ่มในการควบคุม
แชร์เรื่องนี้