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細節(jié)
1、常用MYSQL ERROR CODE 列表
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。
2、如果你不想插ERROR CODE的話,就用速記條件來代替
SQLWARNING 代表所有以01開頭的錯誤代碼
NOT FOUND 代表所有以02開頭的錯誤代碼,當(dāng)然也可以代表一個游標到達數(shù)據(jù)集的末尾。
SQLEXCEPTION 代表除了SQLWARNING和NOT FOUND 的所有錯誤代碼
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)在來看一下遇到錯誤繼續(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
此列沒有默認值,插入的時候會出現(xiàn)警告或者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)
遇到錯誤的時候插入的新記錄。
mysql> select @x; +------+ | @x | +------+ | 3 | +------+ 1 row in set (0.00 sec)
相關(guān)文章
MySQL essential版本和普通版本有什么區(qū)別?
安裝mysql的朋友可能會發(fā)現(xiàn)有時候我們看到essential版本,究竟與其它mysql版本有什么區(qū)別呢,這里簡單介紹下2013-06-06mysql 5.7.21 winx64綠色版安裝配置方法圖文教程
這篇文章主要為大家詳細介紹了mysql 5.7.21 winx64綠色版安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09Navicat for Mysql 字段注釋中文亂碼問題及解決
這篇文章主要介紹了Navicat for Mysql 字段注釋中文亂碼問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09CentOS7.x卸載與安裝MySQL5.7的操作過程及編碼格式的修改方法
這篇文章主要介紹了CentOS7.x卸載與安裝MySQL5.7的操作過程及編碼格式的修改方法,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05MySQL Shell import_table數(shù)據(jù)導(dǎo)入的實現(xiàn)
這篇文章主要介紹了MySQL Shell import_table數(shù)據(jù)導(dǎo)入的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08MYSQL根據(jù)分組獲取組內(nèi)多條數(shù)據(jù)中符合條件的一條(實例詳解)
這篇文章主要介紹了MYSQL根據(jù)分組獲取組內(nèi)多條數(shù)據(jù)中符合條件的一條,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06mysql怎么關(guān)閉sql_mode=ONLY_FULL_GROUP_BY模式
前段時間在項目開發(fā)過程中發(fā)現(xiàn)了系統(tǒng)異常,打開日志查看發(fā)現(xiàn)了如下的這個報錯,查找相關(guān)資料終于解決了,這篇文章主要給大家介紹了關(guān)于mysql怎么關(guān)閉sql_mode=ONLY_FULL_GROUP_BY模式的相關(guān)資料,需要的朋友可以參考下2024-01-01Mysql 實現(xiàn)向上遞歸查找父節(jié)點并返回樹結(jié)構(gòu)的示例代碼
通過mysql 8.0以下版本實現(xiàn),一個人多角色id,一個角色對應(yīng)某個節(jié)點menu_id,根節(jié)點的父節(jié)點存儲為NULL, 向上遞歸查找父節(jié)點并返回樹結(jié)構(gòu),今天通過本文給大家介紹Mysql遞歸查找父節(jié)點并返回樹結(jié)構(gòu),感興趣的朋友一起看看吧2022-09-09