国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL5的異常處理

2024-07-24 12:55:59
字體:
來源:轉載
供稿:網友

  1. sample problem: log of failures 問題樣例:故障記錄

  當insert失敗時,我希望能將其記錄在日志文件中我們用來展示出錯處理的問題樣例是很普通的。我希望得到錯誤的記錄。當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被插入到主鍵表中。

  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 ...",你將會得到錯誤信息提示。

上一篇:Mysql入門系列:客戶機程序5—MYSQL交互式查詢程序

下一篇:Heartbeat_2.0.3配置MySQL5.0.18集群

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片
猜你喜歡的新聞
猜你喜歡的關注

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 丁青县| 施甸县| 三明市| 宣城市| 高青县| 阳信县| 高雄市| 辽阳市| 六枝特区| 连城县| 五原县| 克什克腾旗| 海兴县| 庆安县| 棋牌| 抚远县| 宣化县| 许昌市| 新昌县| 武乡县| 彭水| 凉城县| 林周县| 玉屏| 乐安县| 宝兴县| 望奎县| 灯塔市| 铜川市| 塔河县| 沧源| 呼图壁县| 金华市| 犍为县| 胶州市| 会同县| 敦化市| 舒城县| 胶州市| 科技| 东宁县|