多窗口同时执行SQL只有第一个有结果,因Navicat默认共享连接导致会话上下文冲突;需为每个窗口新建独立连接并确认右下角显示不同连接名。
多窗口同时执行 SQL 时,为什么只有第一个窗口有结果?
navicat 默认开启「查询窗口共享连接」,多个窗口共用同一个会话上下文。一旦某个窗口执行了 set、begin transaction 或临时表操作,其他窗口会受干扰甚至阻塞——这不是 bug,是连接复用的副作用。
- 打开每个新查询窗口后,立刻点击工具栏 「连接」→「新建连接」(或按
Ctrl+Shift+N),确保独立会话 - 检查右下角状态栏:每个窗口应显示不同连接名(如
localhost:3306 [root]后缀带编号) - 避免在任意窗口执行
START TRANSACTION后不提交,否则其他窗口可能卡在Waiting for table metadata lock
批量执行多个 SQL 文件,怎么避免手动切换窗口?
Navicat 的「批处理作业」功能能自动串行执行多个 .sql 文件,但默认不校验语法、不中断失败项——容易误以为全跑完了,其实中间已出错。
- 把所有 SQL 文件放入同一文件夹,右键 → 「批处理作业」→「新建批处理作业」
- 添加文件时勾选
停止执行当遇到错误(关键!否则CREATE TABLE IF NOT EXISTS失败后仍继续执行后续INSERT) - 输出日志务必勾选
记录到文件,路径设为./batch_log_$(date).log,方便排查哪一行报错 - 注意:批处理不支持交互式语句(如
SELECT @var := 1跨文件传递变量)
执行长耗时查询时,窗口假死或 Navicat 崩溃怎么办?
本质是 Navicat 主线程被阻塞,尤其在 Windows 上加载大量结果集(>50 万行)或执行 EXPLAIN ANALYZE 类诊断语句时。
- 执行前先设置:右键连接 → 「编辑连接」→「高级」→「查询」→「最大行数」设为
1000,勾选「限制结果集」 - 对分析类查询,优先用命令行验证:
mysql -h host -u user -p -e "EXPLAIN FORMAT=JSON SELECT ...",再粘贴到 Navicat - 若已卡死,不要直接关进程;先尝试菜单栏 「查询」→「取消当前查询」(快捷键
Ctrl+Break),多数情况可恢复 - Windows 用户建议关闭「启用硬件加速」(工具 → 选项 → 界面),能显著降低崩溃率
不同窗口连同一数据库但查不到彼此刚插入的数据?
这是事务隔离级别导致的典型现象。Navicat 每个窗口默认开启自动提交(autocommit=1),但手动执行 BEGIN 后,未 COMMIT 的数据对其他窗口不可见。
- 确认是否启用了事务:看窗口标题栏是否有
[Tx]标识;若有,执行COMMIT或ROLLBACK再试 - 快速验证:在窗口 A 执行
SELECT @@autocommit;,返回0即代表已关闭自动提交 - 开发调试时建议统一行为:在每个新窗口开头加
SET autocommit = 1;,避免遗忘提交 - 注意 PostgreSQL 连接需额外检查
default_transaction_isolation,MySQL 则主要盯tx_isolation变量
多窗口协作的真正难点不在操作步骤,而在每个窗口背后隐含的会话状态——连接、事务、变量、字符集,四项里任意一项不一致,就可能让结果变得不可预测。别依赖「看起来一样」,执行前花三秒看一眼右下角连接标识和 [Tx] 提示,比事后查半天日志省力得多。

















