Trigger BEFORE INSERT ทำงานก่อนที่ข้อมูลจะถูก Insert จริง สามารถใช้ตรวจสอบเงื่อนไขและยกเลิกการ Insert ได้โดยส่ง Signal Error
Syntax
DELIMITER //
CREATE TRIGGER trigger_name
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
-- validation logic
IF (condition) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Custom error message';
END IF;
END //
DELIMITER ;
ตัวอย่าง: ห้าม Insert ถ้า SUM(Value) > 60
1. สร้างตาราง
mysql> create table DemoTable1919 ( Value int ); Query OK, 0 rows affected (0.00 sec)
2. สร้าง Trigger BEFORE INSERT
mysql> delimiter //
mysql> create trigger sumis60 before insert on DemoTable1919
-> FOR EACH ROW
-> BEGIN
-> declare custom_message varchar(256);
-> IF (SELECT sum(Value) from DemoTable1919) >= 60 THEN
-> set custom_message = 'cannot insert because sum(Value) is greater than or equal to 60';
-> signal sqlstate '45000' set message_text = custom_message;
-> END IF;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
3. ทดสอบ Insert
mysql> insert into DemoTable1919 values(10); Query OK, 1 row affected (0.00 sec) -- SUM=10 mysql> insert into DemoTable1919 values(20); Query OK, 1 row affected (0.00 sec) -- SUM=30 mysql> insert into DemoTable1919 values(30); Query OK, 1 row affected (0.00 sec) -- SUM=60 mysql> insert into DemoTable1919 values(40); ERROR 1644 (45000): cannot insert because sum(Value) is greater than or equal to 60
Insert ครั้งที่ 4 ล้มเหลวเพราะ SUM จะกลายเป็น 100 (> 60)
รายละเอียด Trigger
| ส่วน | คำอธิบาย |
|---|---|
| BEFORE INSERT | ทำงานก่อน Insert จริง สามารถยกเลิกได้ |
| AFTER INSERT | ทำงานหลัง Insert สำเร็จแล้ว ไม่ยกเลิกได้ |
| FOR EACH ROW | รันทุกแถวที่ Insert (Statement-level ไม่รองรับใน MySQL) |
| NEW.column | เข้าถึงค่าใหม่ที่จะ Insert ได้ (ใน BEFORE/AFTER INSERT) |
| SIGNAL SQLSTATE | โยน Exception หยุดการทำงาน '45000' = Unhandled user-defined exception |
Trigger Timing ทั้งหมด
BEFORE INSERT | AFTER INSERT BEFORE UPDATE | AFTER UPDATE BEFORE DELETE | AFTER DELETE
ดู Trigger ที่มีอยู่
SHOW TRIGGERS; SHOW TRIGGERS FROM database_name; SELECT * FROM information_schema.triggers WHERE trigger_schema = 'db_name';
สรุป: ใช้ CREATE TRIGGER ... BEFORE INSERT ... FOR EACH ROW BEGIN ... SIGNAL ... END เพื่อ Validate ข้อมูลก่อน Insert หยุดการทำงานได้ด้วย SIGNAL SQLSTATE '45000'