navicat sql脚本任务默认出错不中断,需显式启用错误中断机制:可在首行添加set @navicat_abort_on_error = 1;(v16.1+支持/+ abort_on_error /注释),生效后遇错即停,避免脏数据和上下文错误。
navicat脚本任务默认不中断,必须显式配置错误响应
navicat 的「sql 脚本任务」默认行为是:某条语句报错(比如 table 'xxx' doesn't exist),它会继续执行后续语句,而不是像 shell 脚本那样遇到错误就退出。这容易掩盖问题、写入脏数据,甚至让后续依赖语句在错误上下文中运行。
在脚本开头加 SET @navicat_abort_on_error = 1;
这不是 MySQL 原生变量,而是 Navicat 自定义的执行控制开关,仅在 Navicat 执行 SQL 脚本时生效。它必须放在脚本最顶部(第一行),且不能被注释或空行隔开:
SET @navicat_abort_on_error = 1;
SELECT * FROM non_existent_table; -- 这句报错后,后面所有语句都不会执行
INSERT INTO log_table VALUES ('should_not_run');
- 该变量只对当前脚本有效,不影响其他任务或手动执行
- 若脚本中包含
DELIMITER或存储过程定义,SET @navicat_abort_on_error = 1;必须放在DELIMITER改变之前 - 不支持在子查询、函数调用或预处理语句中动态设置
用 /*+ abort_on_error */ 注释替代(v16.1+)
较新版本(Navicat Premium 16.1 及以上)支持以注释形式声明中断策略,更轻量、无需变量赋值:
/*+ abort_on_error */ DROP TABLE IF EXISTS temp_stage; CREATE TABLE temp_stage AS SELECT * FROM source_table WHERE ...; UPDATE target_table SET flag = 1 WHERE id IN (SELECT id FROM temp_stage);
- 注释必须顶格、无空格,且紧贴第一行
- 效果等同于
SET @navicat_abort_on_error = 1;,但兼容性略差——v15 或旧版直接忽略该注释 - 不能和变量方式混用;两者同时存在时,以注释为准
错误日志里看不到“已跳过”不代表没生效
即使设置了中断机制,Navicat 日志仍可能显示“任务完成”,因为它是按“脚本执行流程结束”统计,而非“所有语句成功”。关键要看:
- 日志中最后一条成功执行的语句之后,是否再无其他语句记录
- 目标表/文件/结果集是否停留在预期中间状态(比如只建了表、没插数据)
- 手动在查询窗口执行同一脚本,观察报错后是否真停住——这是最可靠的验证方式
真正容易被忽略的是:Navicat 不会在界面高亮“中断点”,也不会弹窗提示“因错误提前终止”,你得自己比对日志行数和脚本行数。











