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

2016-02-19 16:39 1 1 收藏

今天图老师小编要向大家分享个带你轻松接触MySQL数据库的异常处理教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

  对于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

  遇到错误继续的情况

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  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)

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

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

  mysql select @x;

  +------+

  | @x |

  +------+

  | 3 |

  +------+

  1 row in set (0.00 sec)

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1612647.html

延伸阅读
根据定义,数据库管理系统的目的就是管理数据。即使一条简单的SELECT 1 语句也涉及表达式求值以产生一个整型数据值。MySQL 中的每个数据值都有类型。例如, 37.4 是一个数,而“ a b c”是一个串。有时,数据的类型是明显的,因为在使用C R E ATE TABLE 语句时指定了作为表的组成部分定义的每个列的类型,如: 而有时,数据类型是...
3.5 获取数据库和表的有关信息     MySQL 提供了几条获取数据库和表中信息的语句。这些语句对于了解数据库的内容及了解自己表的结构很有帮助。还可以将它们作为使用A LTER TABLE 的一种辅助手段;能够知道当前列是如何定义的,计划出怎样对列进行更改会更为容易。SHOW 语句可用来获取数据库和表的几个方面的信息,它有如下...
3.9 MySQL 不支持的功能     本节介绍其他数据库中有而MySQL 中无的功能。它介绍省略了什么功能,以及在需要这些功能时怎么办。一般情况下, MySQL 之所以忽略某些功能是因为它们有负面性能影响。有的功能正在开发者的计划清单上,一旦找到一种方法可以实现相应的功能而又不致于影响良好性能的目标,就会对它们进行实现。...
首先设置MySQL主服务器: 在主服务器上为从服务器建立一个用户: 1.grant replication slave on *.* to 192.168.0.1 identified by '1234'; #4.1以后用这个,以前可以用 file. #grant file on *.* to 192.168.0.1 identified by '1234'; #后来我又加了super和client save权限,可以先不加.然后再试...
数据库目录是MySQL数据库服务器存放数据文件的地方,不仅包括有关表的文件,还包括数据文件和MySQL的服务器选项文件。不同的分发,数据库目录的缺省位置是不同的。 数据目录的位置 缺省的数据库位置 缺省数据库的位置编译在服务器中。 ◆如果您是在一个源程序分发包中安装 MySQL,典型的缺省位置可能是 /usr/local/var...

经验教程

122

收藏

24
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部