mysql数据库异常处理_带你轻松接触MySQL数据库的异常处理

对于MySQL的异常处理,本人不常用。不过我觉得还是有写下来的必要。

标准格式

DECLARE handler_type HANDLER FOR condition_value[,…] statement

handler_type:

CONTINUE

| EXIT

| UNDO –暂时不支持

condition_value:

SQLSTATE [VALUE] sqlstate_value

| condition_name

| SQLWARNING

| NOT FOUND

| SQLEXCEPTION

| mysql_error_code

condition_value细节

1、MySQL ERROR CODE 列表

如果需要查看更多的错误列表可以直接到MySQL安装路径下。

比如我的/usr/local/mysql/share/mysql/errmsg.txt

说明:SQLSTATE [VALUE] sqlstate_value这种格式是专门为ANSI SQL 和 ODBC以及其他的标准.

并不是所有的MySQL ERROR CODE 都映射到SQLSTATE。

2、假如不需要插入ERROR CODE,可以用速记条件来代替

SQLWARNING 代表所有以01开头的错误代码

NOT FOUND 代表所有以02开头的错误代码,当然也可以代表一个游标到达数据集的末尾。

SQLEXCEPTION 代表除了SQLWARNING和NOT FOUND 的所有错误代码。

3、具体示例:

create TABLE t (s1 int,primary key (s1));

mysql> use t_girl

Database changed

mysql> create TABLE t (s1 int,primary key (s1));

Query OK, 0 rows affected (0.00 sec)

mysql>

mysql>

mysql> DELIMITER ||

mysql> create PROCEDURE handlerdemo ()

-> BEGIN

-> DECLARE EXIT HANDLER FOR SQLSTATE ’23000’ BEGIN END; — 遇到重复键值就退出

-> SET @x = 1;

-> insert INTO t VALUES (1);

-> SET @x = 2;

-> insert INTO t VALUES (1);

-> SET @x = 3;

-> END||

Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;

mysql> call handlerdemo();

Query OK, 0 rows affected (0.00 sec)

mysql> select @x;

+——+

| @x |

+——+

| 2 |

+——+

1 row in set (0.00 sec)

mysql> call handlerdemo();

Query OK, 0 rows affected (0.00 sec)

mysql> select @x;

+——+

| @x |

+——+

| 1 |

+——+

1 row in set (0.00 sec)

mysql>

遇到错误继续的情况

mysql> truncate table t;

Query OK, 0 rows affected (0.01 sec)

mysql> DELIMITER $$

mysql> drop PROCEDURE IF exists `t_girl`.`handlerdemo`$$

Query OK, 0 rows affected (0.00 sec)

mysql> create DEFINER=`root`@`localhost` PROCEDURE `handlerdemo`()

-> BEGIN

-> DECLARE CONTINUE HANDLER FOR SQLSTATE ’23000’ BEGIN END;

-> SET @x = 1;

-> insert INTO t VALUES (1);

-> SET @x = 2;

-> insert INTO t VALUES (1);

-> SET @x = 3;

-> END$$

Query OK, 0 rows affected (0.01 sec)

mysql> DELIMITER ;

mysql> call handlerdemo();

Query OK, 0 rows affected (0.00 sec)

mysql> select @x;

+——+

| @x |

+——+

| 3 |

+——+

1 row in set (0.00 sec)

mysql> call handlerdemo();

Query OK, 0 rows affected (0.00 sec)

mysql> select @x;

+——+

| @x |

+——+

| 3 |

+——+

1 row in set (0.00 sec)

mysql>

我们可以看到,始终执行到最后。

当然,上面的SQLSTATE ’23000’可以替换为1062。

警告:

mysql> alter table t add s2 int not null;

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0

这个列没有默认值,插入的时候会出现警告或者1364错误提示。

mysql> DELIMITER $$

mysql> drop PROCEDURE IF exists `t_girl`.`handlerdemo`$$

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create DEFINER=`root`@`localhost` PROCEDURE `handlerdemo`()

-> BEGIN

-> DECLARE CONTINUE HANDLER FOR 1062 BEGIN END;

-> DECLARE CONTINUE HANDLER FOR SQLWARNING

-> BEGIN

-> update t set s2 = 2;

-> END;

-> DECLARE CONTINUE HANDLER FOR 1364

-> BEGIN

-> insert INTO t(s1,s2) VALUES (1,3);

-> END;

-> SET @x = 1;

-> insert INTO t(s1) VALUES (1);

-> SET @x = 2;

-> insert INTO t(s1) VALUES (1);

-> SET @x = 3;

-> END$$

Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;

mysql> call handlerdemo();

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;

+—-+—-+

| s1 | s2 |

+—-+—-+

| 1 | 3 |

+—-+—-+

1 row in set (0.00 sec)

遇到错误时,插入的新记录。

mysql> select @x;

+——+

| @x |

+——+

| 3 |

+——+

1 row in set (0.00 sec)

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

fd36bffceef597f61007249bab39600c.png

TechTarget

官方微博

1a369747a5d362acddc09aa36b6fafe0.png

TechTarget中国

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值