MySQL5的異常處理

2021-08-24 18:34:21 字數 3941 閱讀 1772

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

handler for

| 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。

MySQL5的異常處理

1.sample problem log of failures 問題樣例 故障記錄 當insert失敗時,我希望能將其記錄在日誌檔案中我們用來展示出錯處理的問題樣例是很普通的。我希望得到錯誤的記錄。當insert失敗時,我想在另乙個檔案中記下這些錯誤的資訊,例如出錯時間,出錯原因等。我對插入特別感...

mysql5無法注入 mysql5注入

對mysql5注入時,可以直接查詢information schema中的tables表,快速找到所需的表段。同時可以利用group concat函式,得到你想得到的東西,不用limit乙個乙個猜。前面先轉轉別人的東西 and 1 2 union select 1,2,group concat us...

mysql5忘記密碼後的處理方法

今天想到用mysql,突然發現忘記mysql的root密碼了,搜尋引擎找了一下方法,有一些方法根本不可行。實際成功的恢復mysql5密碼的方法如下 停止mysql5服務 在dos視窗下輸入net stop mysql5,mysql5是mysql資料庫的服務名,如果您的mysql服務名不是mysql5...