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