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

ป้องกันไม่ให้ Insert ค่า 0 ลงในคอลัมน์ MySQL ด้วย Trigger BEFORE INSERT

ใช้ 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 แทน)