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

วิธี Raise Error (โยน Exception) ใน MySQL ด้วย SIGNAL

MySQL 5.5+ รองรับ SIGNAL สำหรับโยน Error/Exception เองใน Stored Procedure, Trigger, Function

Syntax พื้นฐาน

SIGNAL SQLSTATE 'sqlstate_value'
SET MESSAGE_TEXT = 'ข้อความ Error',
    MYSQL_ERRNO = error_number;

ตัวอย่างการใช้งาน

1. โยน Error แบบง่าย

SIGNAL SQLSTATE '42927'
SET MESSAGE_TEXT = 'Error Generated';

ผลลัพธ์

ERROR 1644 (42927): Error Generated

2. ใน Stored Procedure (Validation)

DELIMITER //
CREATE PROCEDURE InsertUser(IN p_age INT)
BEGIN
    IF p_age < 0 THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'Age cannot be negative',
            MYSQL_ERRNO = 1001;
    END IF;
    
    IF p_age > 150 THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'Age too high',
            MYSQL_ERRNO = 1002;
    END IF;
    
    INSERT INTO users (age) VALUES (p_age);
END //
DELIMITER ;

3. ใน Trigger (BEFORE INSERT/UPDATE)

CREATE TRIGGER validate_age_before_insert
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
    IF NEW.age < 18 THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'User must be at least 18 years old';
    END IF;
END;

SQLSTATE Codes ที่นิยมใช้

คำสั่งที่เกี่ยวข้อง

  • RESIGNAL - โยน Error เดิมต่อ (ใน Handler)
  • DECLARE ... HANDLER - จับ Error และจัดการ
  • GET DIAGNOSTICS - ดูรายละเอียด Error ล่าสุด

Best Practice

  • ใช้ SQLSTATE '45000' สำหรับ Custom Error ทั้งหมด
  • ตั้ง MYSQL_ERRNO ให้มีความหมาย (1000+ สำหรับ Custom)
  • ข้อความ Error ควรเป็นภาษาอังกฤษ (Standard) หรือรองรับ i18n
  • Log Error ก่อน SIGNAL ถ้าจำเป็น
SQLSTATEความหมายใช้เมื่อไหร่
45000Unhandled User-Defined ExceptionCustom Error ทั่วไป (แนะนำ)
42927Function/Procedure ErrorError ใน Function/Procedure
23000Integrity Constraint ViolationForeign Key, Unique, Check Violation
22003Numeric Value Out of Rangeค่าตัวเลขเกินช่วง