关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » MySQL »MySQL5的异常处理 Sample Problem: Log Of Failures 问题样例

    MySQL5的异常处理 Sample Problem: Log Of Failures 问题样例

    2016-01-30 20:58:27 出处:ITJS
    分享

    微信扫一扫:分享

    Scan me!

    微信里点“发现”,扫一下

    二维码便可将本文分享至朋友圈。

    1. Sample Problem: Log Of Failures 问题样例:故障记录

    当INSERT失败时,我希望能将其记录在日志文件中我们用来展示出错处理的问题样例是很普通的,

    MySQL5的异常处理

    。我希望得到错误的记录。当INSERT失败时,我想在另一个文件中记下这些错误的信息,例如出错时间,出错原因等。我对插入特别感兴趣的原因是它将违反外键关联的约束



    2. Sample Problem: Log Of Failures (2)

    mysql> CREATE TABLE t2

    1 INT, PRIMARY KEY (s1))

    engine=innodb;//

    mysql> CREATE TABLE t3 (s1 INT, KEY (s1),

    FOREIGN KEY (s1) REFERENCES t2 (s1))

    engine=innodb;//

    mysql> INSERT INTO t3 VALUES (5);//

    ...

    ERROR 1216 (23000): Cannot add or update a child row: a foreign key

    constraint fails(这里显示的是系统的出错信息)

    我开始要创建一个主键表,以及一个外键表。我们使用的是InnoDB,因此外键关联检查是打开的。然后当我向外键表中插入非主键表中的值时,动作将会失败。当然这种条件下可以很快找到错误号1216。

    3. Sample Problem: Log Of Failures

    CREATE TABLE error_log (error_message

    CHAR(80))//

    下一步就是建立一个在做插入动作出错时存储错误的表。

    4. Sample Problem: Log Of Errors

    CREATE PROCEDURE p22 (parameter1 INT)

    BEGIN

    DECLARE EXIT HANDLER FOR 1216

    INSERT INTO error_log VALUES

    (CONCAT('Time: ',current_date,

    '. Foreign Key Reference Failure For

    Value = ',parameter1));

    INSERT INTO t3 VALUES (parameter1);

    END;//

    上面就是我们的程序。这里的第一个语句DECLARE EXIT HANDLER是用来处理异常的。意思是如果错误1215发生了,这个程序将会在错误记录表中插入一行。EXIT意思是当动作成功提交后退出这个复合语句。

    5. Sample Problem: Log Of Errors

    CALL p22 (5) //

    调用这个存储过程会失败,这很正常,因为5值并没有在主键表中出现。但是没有错误信息返回因为出错处理已经包含在过程中了。t3表中没有增加任何东西,但是error_log表中记录下了一些信息,这就告诉我们INSERT into table t3动作失败。

    DECLARE HANDLER syntax 声明异常处理的语法

    DECLARE

    { EXIT | CONTINUE }

    HANDLER FOR

    { error-number | { SQLSTATE error-string } | condition }

    SQL statement

    上面就是错误处理的用法,也就是一段当程序出错后自动触发的代码。MySQL允许两种处理器,一种是EXIT处理,我们刚才所用的就是这种。另一种就是我们将要演示的,CONTINUE处理,它跟EXIT处理类似,不同在于它执行后,原主程序仍然继续运行,那么这个复合语句就没有出口了。

    1. DECLARE CONTINUE HANDLER example CONTINUE处理例子

    CREATE TABLE t4 (s1 int,primary key(s1));//

    CREATE PROCEDURE p23 ()

    BEGIN

    DECLARE CONTINUE HANDLER

    FOR SQLSTATE '23000' SET @x2 = 1;

    SET @x = 1;

    INSERT INTO t4 VALUES (1);

    SET @x = 2;

    INSERT INTO t4 VALUES (1);

    SET @x = 3;

    END;//

    这是MySQL参考手册上的CONTINUE处理的例子,这个例子十分好,所以我把它拷贝到这里。通过这个例子我们可以看出CONTINUE处理是如何工作的。

    2. DECLARE CONTINUE HANDLER声明CONTINUE异常处理

    CREATE TABLE t4 (s1 int,primary key(s1));//

    CREATE PROCEDURE p23 ()

    BEGIN

    DECLARE CONTINUE HANDLER

    FOR SQLSTATE '23000' SET @x2 = 1; <--

    SET @x = 1;

    INSERT INTO t4 VALUES (1);

    SET @x = 2;

    INSERT INTO t4 VALUES (1);

    SET @x = 3;

    END;//

    这次我将为SQLSTATE值定义一个处理程序。还记得前面我们使用的MySQL错误代码1216吗?事实上这里的23000SQLSTATE是更常用的,当外键约束出错或主键约束出错就被调用了。

    3. DECLARE CONTINUE HANDLER

    CREATE TABLE t4 (s1 int,primary key(s1));//

    CREATE PROCEDURE p23 ()

    BEGIN

    DECLARE CONTINUE HANDLER

    FOR SQLSTATE '23000' SET @x2 = 1;

    SET @x = 1; <--

    INSERT INTO t4 VALUES (1);

    SET @x = 2;

    INSERT INTO t4 VALUES (1);

    SET @x = 3;

    END;//

    这个存储过程的第一个执行的语句是"SET @x = 1"。

    4. DECLARE CONTINUE HANDLER example

    CREATE TABLE t4 (s1 int,primary key(s1));//

    CREATE PROCEDURE p23 ()

    BEGIN

    DECLARE CONTINUE HANDLER

    FOR SQLSTATE '23000' SET @x2 = 1;

    SET @x = 1;

    INSERT INTO t4 VALUES (1);

    SET @x = 2;

    INSERT INTO t4 VALUES (1); <--

    SET @x = 3;

    END;//

    运行后值1被插入到主键表中,

    电脑资料

    《MySQL5的异常处理》(http://www.unjs.com)。



    5. DECLARE CONTINUE HANDLER

    CREATE TABLE t4 (s1 int,primary key(s1));//

    CREATE PROCEDURE p23 ()

    BEGIN

    DECLARE CONTINUE HANDLER

    FOR SQLSTATE '23000' SET @x2 = 1;

    SET @x = 1;

    INSERT INTO t4 VALUES (1);

    SET @x = 2; <--

    INSERT INTO t4 VALUES (1);

    SET @x = 3;

    END;//

    然后@x的值变为2。
    6. DECLARE CONTINUE HANDLER example

    CREATE TABLE t4 (s1 int,primary key(s1));//

    CREATE PROCEDURE p23 ()

    BEGIN

    DECLARE CONTINUE HANDLER

    FOR SQLSTATE '23000' SET @x2 = 1;

    SET @x = 1;

    INSERT INTO t4 VALUES (1);

    SET @x = 2;

    INSERT INTO t4 VALUES (1); <--

    SET @x = 3;

    END;//

    然后程序尝试再次往主键表中插入数值,但失败了,因为主键有唯一性限制。

    7. DECLARE CONTINUE HANDLER example

    CREATE TABLE t4 (s1 int,primary key(s1));//

    CREATE PROCEDURE p23 ()

    BEGIN

    DECLARE CONTINUE HANDLER

    FOR SQLSTATE '23000' SET @x2 = 1; <--

    SET @x = 1;

    INSERT INTO t4 VALUES (1);

    SET @x = 2;

    INSERT INTO t4 VALUES (1);

    SET @x = 3;

    END;//

    由于插入失败,错误处理程序被触发,开始进行错误处理。下一个执行的语句是错误处理的语句,@x2被设为2。

    8. DECLARE CONTINUE HANDLER example

    CREATE TABLE t4 (s1 int,primary key(s1));//

    CREATE PROCEDURE p23 ()

    BEGIN

    DECLARE CONTINUE HANDLER

    FOR SQLSTATE '23000' SET @x2 = 1;

    SET @x = 1;

    INSERT INTO t4 VALUES (1);

    SET @x = 2;

    INSERT INTO t4 VALUES (1);

    SET @x = 3; <--

    END;//

    到这里并没有结束,因为这是CONTINUE异常处理。所以执行返回到失败的插入语句之后,继续执行将@x设定为3动作。

    9. DECLARE CONTINUE HANDLER example

    mysql> CALL p23()//

    Query OK, 0 rows affected (0.00 sec)

    mysql> SELECT @x, @x2//

    +------+------+

    | @x | @x2 |

    +------+------+

    | 3 | 1 |

    +------+------+

    1 row in set (0.00 sec)

    运行过程后我们观察@x的值,很确定的可以知道是3,观察@x2的值,为1。从这里可以判断程序运行无误,完全按照我们的思路进行。大家可以花点时间去调整错误处理器,让检查放在语句段的首部,而不是放在可能出现错误的地方,虽然那样看起来程序很紊乱,跳来跳去的感觉。但是这样的代码很安全也很清楚。

    1. DECLARE CONDITION

    CREATE PROCEDURE p24 ()

    BEGIN

    DECLARE `Constraint Violation`

    CONDITION FOR SQLSTATE '23000';

    DECLARE EXIT HANDLER FOR

    `Constraint Violation` ROLLBACK;

    START TRANSACTION;

    INSERT INTO t2 VALUES (1);

    INSERT INTO t2 VALUES (1);

    COMMIT;

    END; //

    这是另外一个错误处理的例子,在前面的基础上修改的。事实上你可给SQLSTATE或者错误代码其他的名字,你就可以在处理中使用自己定义的名字了。下面看它是怎么实现的:我把表t2定义为InnoDB表,所以对这个表的插入操作都会ROLLBACK(回滚),ROLLBACK(回滚事务)也是恰好会发生的。因为对主键插入两个同样的值会导致SQLSTATE 23000错误发生,这里SQLSTATE 23000是约束错误。

    2. DECLARE CONDITION声明条件

    CREATE PROCEDURE p24 ()

    BEGIN

    DECLARE `Constraint Violation`

    CONDITION FOR SQLSTATE '23000';

    DECLARE EXIT HANDLER FOR

    `Constraint Violation` ROLLBACK;

    START TRANSACTION;

    INSERT INTO t2 VALUES (1);

    INSERT INTO t2 VALUES (1);

    COMMIT;

    END; //

    这个约束错误会导致ROLLBACK(回滚事务)和SQLSTATE 23000错误发生。

    3. DECLARE CONDITION

    mysql> CALL p24()//

    Query OK, 0 rows affected (0.28 sec)

    mysql> SELECT * FROM t2//

    Empty set (0.00 sec)

    我们调用这个存储过程看结果是什么,从上面结果我们看到表t2没有插入任何记录。全部事务都回滚了。这正是我们想要的。

    4. DECLARE CONDITION

    mysql> CREATE PROCEDURE p9 ()

    -> BEGIN

    -> DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;

    -> DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END;

    -> DECLARE EXIT HANDLER FOR SQLWARNING BEGIN END;

    -> END;//

    Query OK, 0 rows affected (0.00 sec)

    这里是三个预声明的条件:NOT FOUND (找不到行), SQLEXCEPTION (错误),SQLWARNING (警告或注释)。因为它们是预声明的,因此不需要声明条件就可以使用。不过如果你去做这样的声明:"DECLARE SQLEXCEPTION CONDITION ...",你将会得到错误信息提示。

    上一篇返回首页 下一篇

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

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。