2014-07-13 16:51:52
来 源
中存储网
MySQL
MySQL不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法直接抛出异常。这样我们如何实现呢?下面是一种实现的方法。思路就是想办法在触发器中利用一个出错的语句来中断代码的执行。mysql

MySQL 不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法直接抛出异常。这样我们如何实现呢?

下面是一种实现的方法。思路就是想办法在触发器中利用一个出错的语句来中断代码的执行。

mysql> create table t_control(id int primary key);
Query OK, 0 rows affected (0.11 sec)

mysql> insert into t_control values (1);
Query OK, 1 row affected (0.05 sec)

mysql> create table t_bluerosehero(id int primary key,col int);
Query OK, 0 rows affected (0.11 sec)

mysql> delimiter //
mysql> create trigger tr_t_bluerosehero_bi before insert on t_bluerosehero
    -> for each row
    -> begin
    ->  if new.col>30 then
->          insert into t_control values (1);
    ->  end if;
    -> end;
    -> //
Query OK, 0 rows affected (0.08 sec)

mysql> delimiter ;
mysql>
mysql> insert into t_bluerosehero values (1,20);
Query OK, 1 row affected (0.25 sec)

mysql> insert into t_bluerosehero values (2,40);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql>
mysql> select * from t_bluerosehero;
+----+------+
| id | col  |
+----+------+
|  1 |   20 |
+----+------+
1 row in set (0.00 sec)

mysql>

或者

mysql> delimiter //
mysql> create trigger tr_t_bluerosehero_bi before insert on t_bluerosehero
    -> for each row
    -> begin
    ->  declare i int;
    ->  if new.col>30 then
->          insert into xxxx values (1);
    ->  end if;
    -> end;
    -> //
Query OK, 0 rows affected (0.06 sec)

mysql> delimiter ;
mysql> delete from t_bluerosehero;
Query OK, 3 rows affected (0.05 sec)

mysql> insert into t_bluerosehero values (1,20);
Query OK, 1 row affected (0.06 sec)

mysql> insert into t_bluerosehero values (2,40);
ERROR 1146 (42S02): Table 'csdn.xxxx' doesn't exist
mysql>

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。