加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql入门MySQL异常处理浅析

发布时间:2020-12-12 01:30:55 所属栏目:MySql教程 来源:网络整理
导读:《Mysql入门MySQL异常处理浅析》要点: 本文介绍了Mysql入门MySQL异常处理浅析,希望对您有用。如果有疑问,可以联系我们。 MySQL的异常处理分析如下: MYSQL教程 标准格式 MYSQL教程 DECLARE handler_type HANDLER FOR condition_value[,...] statementhand

《Mysql入门MySQL异常处理浅析》要点:
本文介绍了Mysql入门MySQL异常处理浅析,希望对您有用。如果有疑问,可以联系我们。

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教程

http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html
更多错误列表见MySQL安装路径下
比如我的/usr/local/mysql/share/mysql/errmsg.txt
说明一下:SQLSTATE [VALUE] sqlstate_value这种格式是专门为ANSI SQL 和 ODBC以及其他的标准.
并不是所有的MySQL ERROR CODE 都映射到SQLSTATE.MYSQL教程

2、如果你不想插ERROR CODE的话,就用速记条件来代替MYSQL教程

SQLWARNING 代表所有以01开头的错误代码
NOT FOUND 代表所有以02开头的错误代码,当然也可以代表一个游标到达数据集的末尾.
SQLEXCEPTION 代表除了SQLWARNING和NOT FOUND 的所有错误代码MYSQL教程

3、我们现在就用手册上的例子MYSQL教程

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教程

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教程

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教程

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> select * from t;
+----+----+
| s1 | s2 |
+----+----+
| 1 | 3 | 
+----+----+
1 row in set (0.00 sec)

遇到错误的时候插入的新记录.MYSQL教程

mysql> select @x;
+------+
| @x |
+------+
| 3 | 
+------+
1 row in set (0.00 sec)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读