MySQL 如何使用BEFORE UPDATE触发器模拟CHECK CONSTRAINT以更新表中的值?
如我们所知,MySQL支持外键用于引用完整性检查,但不支持CHECK约束。但是我们可以使用触发器来模拟它们。下面的示例可以说明:
阅读更多:MySQL 教程
示例:
假设我们有一个名为“car”的表,其注册号码的固定语法如下 – 两个字母、一个短横线、三个数字、一个短横线、两个字母。如下所示:
mysql> Create table car (number char(9));
Query OK, 0 rows affected (0.32 sec)
创建BEFORE UPDATE触发器,以模拟更新值的CHECK CONSTRAINT-
现在,假设我们尝试使用不正确的值更新表,那么 MySQL 将不会阻止我们这样做,如下所示:
mysql> update car set number='AB-2X5-YZ';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
上述查询在表“car”中更新了不正确的值。在以下查询中,我们将创建一个BEFORE 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