MySQL異常處理淺析
MySQL的異常處理分析如下:
標(biāo)準(zhǔn)格式
DECLARE handler_type HANDLER FOR condition_value[,...] statement handler_type: CONTINUE | EXIT | UNDO --這個(gè)暫時(shí)不支持 condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code condition_value細(xì)節(jié)
1、常用MYSQL ERROR CODE 列表
http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html
更多錯(cuò)誤列表見MySQL安裝路徑下
比如我的/usr/local/mysql/share/mysql/errmsg.txt
說明一下:SQLSTATE [VALUE] sqlstate_value這種格式是專門為ANSI SQL 和 ODBC以及其他的標(biāo)準(zhǔn).
并不是所有的MySQL ERROR CODE 都映射到SQLSTATE。
2、如果你不想插ERROR CODE的話,就用速記條件來代替
SQLWARNING 代表所有以01開頭的錯(cuò)誤代碼
NOT FOUND 代表所有以02開頭的錯(cuò)誤代碼,當(dāng)然也可以代表一個(gè)游標(biāo)到達(dá)數(shù)據(jù)集的末尾。
SQLEXCEPTION 代表除了SQLWARNING和NOT FOUND 的所有錯(cuò)誤代碼
3、我們現(xiàn)在就用手冊上的例子
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; -- 遇到重復(fù)鍵值就退出 -> 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>
現(xiàn)在來看一下遇到錯(cuò)誤繼續(xù)的情況
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>
可以看到,始終執(zhí)行到最后。
當(dāng)然,上面的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
此列沒有默認(rèn)值,插入的時(shí)候會出現(xiàn)警告或者1364錯(cuò)誤提示。
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)
遇到錯(cuò)誤的時(shí)候插入的新記錄。
mysql> select @x; +------+ | @x | +------+ | 3 | +------+ 1 row in set (0.00 sec)
相關(guān)文章
MySQL essential版本和普通版本有什么區(qū)別?
安裝mysql的朋友可能會發(fā)現(xiàn)有時(shí)候我們看到essential版本,究竟與其它mysql版本有什么區(qū)別呢,這里簡單介紹下2013-06-06mysql 5.7.21 winx64綠色版安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了mysql 5.7.21 winx64綠色版安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09Navicat for Mysql 字段注釋中文亂碼問題及解決
這篇文章主要介紹了Navicat for Mysql 字段注釋中文亂碼問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09CentOS7.x卸載與安裝MySQL5.7的操作過程及編碼格式的修改方法
這篇文章主要介紹了CentOS7.x卸載與安裝MySQL5.7的操作過程及編碼格式的修改方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05MySQL Shell import_table數(shù)據(jù)導(dǎo)入的實(shí)現(xiàn)
這篇文章主要介紹了MySQL Shell import_table數(shù)據(jù)導(dǎo)入的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08MYSQL根據(jù)分組獲取組內(nèi)多條數(shù)據(jù)中符合條件的一條(實(shí)例詳解)
這篇文章主要介紹了MYSQL根據(jù)分組獲取組內(nèi)多條數(shù)據(jù)中符合條件的一條,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06mysql怎么關(guān)閉sql_mode=ONLY_FULL_GROUP_BY模式
前段時(shí)間在項(xiàng)目開發(fā)過程中發(fā)現(xiàn)了系統(tǒng)異常,打開日志查看發(fā)現(xiàn)了如下的這個(gè)報(bào)錯(cuò),查找相關(guān)資料終于解決了,這篇文章主要給大家介紹了關(guān)于mysql怎么關(guān)閉sql_mode=ONLY_FULL_GROUP_BY模式的相關(guān)資料,需要的朋友可以參考下2024-01-01Mysql 實(shí)現(xiàn)向上遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu)的示例代碼
通過mysql 8.0以下版本實(shí)現(xiàn),一個(gè)人多角色id,一個(gè)角色對應(yīng)某個(gè)節(jié)點(diǎn)menu_id,根節(jié)點(diǎn)的父節(jié)點(diǎn)存儲為NULL, 向上遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu),今天通過本文給大家介紹Mysql遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu),感興趣的朋友一起看看吧2022-09-09