Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Ngăn chặn giá trị 0 trong trường MySQL?

Ngăn chặn INSERT giá trị 0 vào cột MySQL bằng TRIGGER

Sử dụng TRIGGER BEFORE INSERT để kiểm tra giá trị trước khi chèn, ném lỗi (SIGNAL) nếu giá trị bằng 0.

Ví dụ minh họa

Tạo bảng DemoTable:

mysql> CREATE TABLE DemoTable (Value INT);
Query OK, 0 rows affected (0.85 sec)

Tạo Trigger BEFORE INSERT:

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 can not provide 0 value';
        END IF;
    END //
Query OK, 0 rows affected (0.34 sec)
mysql> DELIMITER ;

Thử chèn giá trị 0 (sẽ báo lỗi):

mysql> INSERT INTO DemoTable VALUES(0);
ERROR 1644 (45000): You cannot provide 0 value

Chèn giá trị khác 0 (thành công):

mysql> INSERT INTO DemoTable VALUES(10);
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable VALUES(-1000);
Query OK, 1 row affected (0.41 sec)

Kiểm tra dữ liệu (không có giá trị 0):

mysql> SELECT * FROM DemoTable;
+-------+
| Value |
+-------+
| 10    |
| -1000 |
+-------+
2 rows in set (0.00 sec)

Giải thích Trigger

  • BEFORE INSERT: Chạy TRƯỚC khi INSERT thực thi
  • FOR EACH ROW: Áp dụng cho từng hàng chèn vào
  • NEW.Value: Giá trị mới sắp được chèn vào cột Value
  • SIGNAL SQLSTATE '45000': Ném lỗi tự định nghĩa (45000 = unhandled user-defined exception)
  • MESSAGE_TEXT: Thông báo lỗi hiển thị cho client

Mở rộng: Ngăn chặn cả 0 VÀ NULL

CREATE TRIGGER prevent_zero_null
BEFORE INSERT ON DemoTable
FOR EACH ROW
BEGIN
    IF NEW.Value = 0 OR NEW.Value IS NULL THEN
        SIGNAL SQLSTATE '45000' 
        SET MESSAGE_TEXT = 'Value cannot be 0 or NULL';
    END IF;
END

Cách khác: CHECK Constraint (MySQL 8.0.16+)

CREATE TABLE DemoTable (
    Value INT,
    CONSTRAINT chk_value_not_zero CHECK (Value <> 0)
);

Lưu ý: CHECK constraint không hỗ trợ SIGNAL custom message, chỉ báo lỗi chung.

Xem/Xóa Trigger

SHOW TRIGGERS;
DROP TRIGGER preventing_to_insert_zero_value;