Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีจำลอง CHECK CONSTRAINT ด้วย Triggers ใน MySQL

MySQL รองรับ foreign key สำหรับ referential integrity แต่ไม่รองรับ CHECK constraint แต่สามารถจำลองได้ด้วย triggers

ตัวอย่าง

สมมติว่ามีตาราง 'car' ที่มีรูปแบบเลขทะเบียนคงที่: 2 ตัวอักษร, ขีด, 3 ตัวเลข, ขีด, 2 ตัวอักษร

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)

ค่านี้ถูกต้อง แต่ค่าถัดไปไม่ถูกต้อง (มีตัวอักษรระหว่างตัวเลข):

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

สร้าง BEFORE INSERT Trigger จำลอง CHECK CONSTRAINT

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)

ลองเพิ่มเลขทะเบียนผิด trigger จะบล็อกและแสดงข้อผิดพลาด:

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)

สร้าง BEFORE UPDATE Trigger จำลอง CHECK CONSTRAINT สำหรับ UPDATE

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