1定义错误处理程序
DECLARE action HANDLER FOR condition_value statement;
action:可以是 CONTINUE(继续执行)或 EXIT(退出当前块)。
condition_value:可以是错误代码、SQLSTATE 或预定义的错误类型(如 SQLEXCEPTION)。
statement:错误发生时执行的语句。
2 预定义的错误类型
SQLEXCEPTION:捕获所有异常。
SQLWARNING:捕获所有警告。
NOT FOUND:捕获 SELECT ... INTO 或游标未找到数据的错误。
3常见的 MySQL 错误代码
1062:唯一键冲突(Duplicate entry)。
1048:字段不能为 NULL(Column cannot be null)。
1054:未知列(Unknown column)。
1146:表不存在(Table doesn't exist)。
1216:外键约束失败(Cannot add or update a child row)。
1217:外键约束失败(Cannot delete or update a parent row)。
4使用 SIGNAL 抛出错误
在存储过程中,可以使用 SIGNAL 语句主动抛出错误。
SIGNAL SQLSTATE 'sqlstate' SET MESSAGE_TEXT = 'error_message';
例如:
CREATE PROCEDURE test_signal()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT 'Error occurred: ', MESSAGE_TEXT;
END;
IF 1 = 1 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Custom error message';
END IF;
END //
示例:
BEGIN
declare i int;
declare d double;
declare exit handler for SQLEXCEPTION
begin
rollback;
end;
start TRANSACTION;
set i=0;
while i<3 do
set i=i+1;
set d=rand();
if d between 0.2 and 0.8 THEN
insert into t1 values(d,now());
ELSE
signal SQLSTATE '41000';
end if;
end while;
commit;
end