當 INSERT 因外鍵約束失敗時,我們希望自動記錄錯誤資訊(時間、原因、值)而非拋出例外中斷流程。
-- 主鍵表
CREATE TABLE t2 (
s1 INT,
PRIMARY KEY (s1)
) ENGINE=InnoDB;
-- 外鍵表
CREATE TABLE t3 (
s1 INT,
KEY (s1),
FOREIGN KEY (s1) REFERENCES t2(s1)
) ENGINE=InnoDB;
-- 測試插入不存在的外鍵值
INSERT INTO t3 VALUES (5);
-- ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails
CREATE TABLE error_log (
error_message CHAR(80)
);
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 FOR 1216:宣告針對錯誤代碼 1216 的退出處理器INSERT INTO error_log ... 記錄錯誤EXIT 表示處理完成後退出當前 BEGIN...END 複合語句,不再執行後續主邏輯CALL p22(5);
結果:
INSERT INTO t3 失敗(因 5 不在 t2 中)t3 無新增資料error_log 記錄一筆:「Time: 2024-01-15. Foreign Key Reference Failure For Value = 5」DECLARE
{ EXIT | CONTINUE }
HANDLER FOR
{ error-number | SQLSTATE error-string | condition }
SQL statement
| 模式 | 行為 |
|---|---|
EXIT | 處理完畢後退出當前複合語句(類似 try-catch 後跳出) |
CONTINUE | 處理完畢後繼續執行複合語句後續陳述式 |