当前位置:七道奇文章资讯数据防范MySQL防范
日期:2011-05-02 15:44:00  来源:本站整理

MySQL5的非常处理[MySQL防范]

赞助商链接



  本文“MySQL5的非常处理[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Error Handling 非常处理

1. Sample Problem: Log Of Failures 问题样例:弊端记录

当INSERT失利时,我但愿能将其记录在日记文件中我们用来展示出错处理的问题样例是很普通的.我但愿得到错误的记录.当INSERT失利时,我想在另一个文件中记下这些错误的信息,比方出错时间,出错缘由等.我对插入分外感爱好的缘由是它将违反外键关联的约束

2. Sample Problem: Log Of Failures (2)



MySQL> CREATE TABLE t2

s1 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被插入到主键表中.

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 ...",你将会得到错误信息提醒.   以上是“MySQL5的非常处理[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • Windows 搭配 IIS7 PHP MySQL 环境
  • mysql Out of memory (Needed 16777224 bytes)的错误办理
  • mysql提醒[Warning] Invalid (old?) table or database name问题的办理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • MySQL Order By语法介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • mysql数据库插入速度和读取速度的调整记录
  • MySQL Order By索引优化办法
  • MySQL Order By用法分享
  • mysql #1062 –Duplicate entry ''1'' for key ''PRIMARY''
  • MySQL Order By Rand()效率解析
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .