ใช้ Trigger ป้องกันการ Insert ค่า 0
สร้าง BEFORE INSERT TRIGGER ตรวจสอบค่าก่อน Insert หากเป็น 0 ให้ Raise Error ด้วย SIGNAL SQLSTATE '45000'
Syntax Trigger
DELIMITER //
CREATE TRIGGER trigger_name
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
IF NEW.column_name = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error message';
END IF;
END //
DELIMITER ;
ตัวอย่างการใช้งาน
สร้างตาราง:
mysql> CREATE TABLE DemoTable (Value INT); Query OK, 0 rows affected (0.85 sec)
สร้าง Trigger ป้องกันค่า 0:
mysql> DELIMITER //
mysql> CREATE TRIGGER preventing_to_insert_zero_value
BEFORE INSERT ON DemoTable
FOR EACH ROW
BEGIN
IF NEW.Value = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'You cannot provide 0 value';
END IF;
END //
Query OK, 0 rows affected (0.34 sec)
mysql> DELIMITER ;
ทดสอบ Insert 0 -> **Error**:
mysql> INSERT INTO DemoTable VALUES (0); ERROR 1644 (45000): You cannot provide 0 value
Insert ค่าอื่น -> **สำเร็จ**:
mysql> INSERT INTO DemoTable VALUES (10), (-1000); Query OK, 2 rows affected
ตรวจสอบข้อมูล (ไม่มี 0):
mysql> SELECT * FROM DemoTable;
+-------+ | Value | +-------+ | 10 | | -1000 | +-------+ 2 rows in set (0.00 sec)
ขยายความ: ป้องกันหลายเงื่อนไข
CREATE TRIGGER validate_data
BEFORE INSERT ON DemoTable
FOR EACH ROW
BEGIN
IF NEW.Value = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Value cannot be zero';
ELSEIF NEW.Value < -1000 THEN
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = 'Value too small';
ELSEIF NEW.Value > 10000 THEN
SIGNAL SQLSTATE '45002' SET MESSAGE_TEXT = 'Value too large';
END IF;
END;
คำสั่งจัดการ Trigger
- ดู Trigger:
SHOW TRIGGERS;หรือSELECT * FROM information_schema.triggers; - ลบ Trigger:
DROP TRIGGER trigger_name; - Trigger ทำงานก่อน/หลัง:
BEFORE INSERT,AFTER INSERT,BEFORE UPDATE,AFTER UPDATE,BEFORE DELETE,AFTER DELETE
ข้อควรระวัง
- Trigger ใช้ทรัพยากร เพิ่ม Latency ในการ Insert
- Error Code
45000= User-defined Exception - ไม่สามารถใช้
RETURNใน Trigger ได้ (ใช้ SIGNAL แทน)