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

Sử dụng BEFORE INSERT trigger để mô phỏng CHECK CONSTRAINT khi chèn dữ liệu

MySQL hỗ trợ khóa ngoại cho tính toàn vẹn tham chiếu nhưng không hỗ trợ CHECK constraint. Tuy nhiên, ta có thể mô phỏng chúng bằng trigger. Ví dụ minh họa:

Ví dụ

Giả sử có bảng car lưu biển số xe theo cú pháp cố định: 2 chữ cái, dấu gạch ngang, 3 chữ số, dấu gạch ngang, 2 chữ cái (ví dụ: AB-235-YZ).

mysql> Create table car (number char(9));
Query OK, 0 rows affected (0.32 sec)
mysql> Insert into car values('AB-235-YZ');
Query OK, 1 row affected (0.10 sec)

Giá trị trên hợp lệ. Nhưng nếu chèn giá trị không đúng cú pháp:

mysql> insert into car values('AB-2X5-YZ');
Query OK, 1 row affected (0.04 sec)

Giá trị AB-2X5-YZ không hợp lệ vì có ký tự giữa các chữ số.

Tạo BEFORE INSERT trigger để mô phỏng CHECK CONSTRAINT

Tạo trigger ngăn chặn chèn dữ liệu sai:

mysql> delimiter //
mysql> create trigger car_insert_value 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 ;
mysql> Delete from car;
Query OK, 2 rows affected (0.06 sec)

Khi chèn số sai, trigger báo lỗi:

mysql> insert into car values('AB-2X5-YZ');
ERROR 1644 (45000): Not a Valid Number

Nhưng giá trị hợp lệ vẫn chèn được:

mysql> insert into car values('AB-235-YZ');
Query OK, 1 row affected (0.04 sec)