Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

สร้าง MySQL Trigger BEFORE INSERT เพื่อตรวจสอบเงื่อนไขก่อนเพิ่มข้อมูล

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'