Computer >> Máy Tính >  >> Lập trình >> MySQL

Làm cách nào để sử dụng trình kích hoạt BEFORE INSERT để mô phỏng CHECK CONSTRAINT để chèn các giá trị vào bảng?


Như chúng ta biết rằng MySQL hỗ trợ khóa ngoại cho tính toàn vẹn tham chiếu nhưng nó không hỗ trợ ràng buộc CHECK. Nhưng chúng ta có thể mô phỏng chúng bằng cách sử dụng trình kích hoạt. Nó có thể được minh họa với sự trợ giúp của một ví dụ dưới đây -

Ví dụ

Giả sử chúng ta có một bảng tên là 'car' có thể có số đăng ký cú pháp sửa lỗi như hai chữ cái, một dấu gạch ngang, ba chữ số, một dấu gạch ngang, hai chữ cái như sau -

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 là giá trị hợp lệ nhưng còn giá trị mà chúng ta sẽ chèn trong truy vấn tiếp theo.

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

Giá trị trên không phải là giá trị hợp lệ vì nó chứa một ký tự nằm giữa các chữ số trái với cú pháp cố định mà chúng tôi đang sử dụng.

Tạo trình kích hoạt CHÈN TRƯỚC để mô phỏng CHECK CONSTRAINT để chèn các giá trị -

Bây giờ, chúng ta có thể tạo một trình kích hoạt như sau để ngăn chặn loại chèn như vậy -

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)

Bây giờ, khi chúng tôi cố gắng chèn số không chính xác, trình kích hoạt được tạo ở trên sẽ ngăn chúng tôi làm như vậy và sẽ xuất hiện một lỗi như sau -

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

Tuy nhiên, chúng ta có thể chèn các giá trị hợp lệ như sau -

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