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

Làm cách nào chúng ta có thể mô phỏng CHECK CONSTRAINT bằng cách sử dụng trình kích hoạt?

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ý theo cú pháp sửa chữa 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)

Tạo trình kích hoạt TRƯỚC KHI CẬP NHẬT để mô phỏng CHECK CONSTRAINT để cập nhật các giá trị -

Bây giờ, giả sử nếu chúng tôi cố gắng cập nhật bảng với một giá trị không chính xác thì MySQL sẽ không ngăn chúng tôi làm như vậy như sau 7minus;

mysql> update car set number='AB-2X5-YZ';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0

Truy vấn trên đã cập nhật giá trị không chính xác trong bảng "car". Trong truy vấn sau, chúng tôi sẽ tạo một trình kích hoạt TRƯỚC KHI CẬP NHẬT sẽ ngăn chúng tôi cập nhật dữ liệu không chính xác trong bảng -

mysql> delimiter //
mysql> create trigger car_update_value 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