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 thiFOR EACH ROW: Áp dụng cho từng hàng chèn vàoNEW.Value: Giá trị mới sắp được chèn vào cột ValueSIGNAL 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;