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

Mô phỏng CHECK CONSTRAINT trong MySQL bằng trigger

MySQL không hỗ trợ CHECK constraint (trước 8.0.16), nhưng có thể mô phỏng bằng trigger.

Ví dụ: Kiểm tra định dạng biển số xe

Yêu cầu: 2 chữ cái - 3 chữ số - 2 chữ cái (ví dụ: AB-235-YZ).

mysql> CREATE TABLE car (number CHAR(9));
mysql> INSERT INTO car VALUES('AB-235-YZ');  -- hợp lệ
mysql> INSERT INTO car VALUES('AB-2X5-YZ');  -- KHÔNG hợp lệ (chữ giữa số) nhưng MySQL chấp nhận

Tạo trigger BEFORE INSERT

mysql> DELIMITER //
mysql> CREATE TRIGGER car_insert_check BEFORE INSERT ON car
    -> FOR EACH ROW
    -> BEGIN
    ->   IF NEW.number NOT RLIKE '^[[:alpha:]]{2}-[[:digit:]]{3}-[[:alpha:]]{2}$' THEN
    ->     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Not a valid Number';
    ->   END IF;
    -> END //
Query OK, 0 rows affected (0.15 sec)
mysql> DELIMITER ;

Kiểm tra:

mysql> INSERT INTO car VALUES('AB-2X5-YZ');
ERROR 1644 (45000): Not a Valid Number

mysql> INSERT INTO car VALUES('AB-235-YZ');
Query OK, 1 row affected (0.04 sec)

Tạo trigger BEFORE UPDATE

mysql> DELIMITER //
mysql> CREATE TRIGGER car_update_check BEFORE UPDATE ON car
    -> FOR EACH ROW
    -> BEGIN
    ->   IF NEW.number NOT RLIKE '^[[:alpha:]]{2}-[[:digit:]]{3}-[[:alpha:]]{2}$' THEN
    ->     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Not a valid number';
    ->   END IF;
    -> END //
Query OK, 0 rows affected (0.11 sec)
mysql> DELIMITER ;

mysql> UPDATE car SET number='AB-2X5-YZ';
ERROR 1644 (45000): Not a valid number

Trigger chặn cả INSERT và UPDATE dữ liệu không hợp lệ.