必须用“执行 SQL 脚本”(Alt+X)而非“执行 SQL 语句”(Ctrl+Enter),因后者将多条DDL视为单字符串提交,而多数数据库默认禁用多语句模式,导致只执行第一条或报语法错误;Alt+X则按分号切分、逐条独立执行。

必须用“执行 SQL 脚本”,不能点“执行 SQL 语句”按钮——后者会把多条语句拼成一条提交,直接报错或只执行第一条。
为什么“执行 SQL 语句”(Ctrl+Enter)不能跑多条DDL
这个快捷键本质是「提交光标所在或选中的单个语句块」。哪怕你写了 CREATE TABLE t1(...); CREATE TABLE t2(...);,DBeaver 仍把它当做一个字符串传给驱动,而 MySQL、YashanDB、Oracle 等多数数据库默认禁用多语句模式(allowMultiQueries=false),结果就是:YAS-04209: unexpected word ; 或 ERROR 1064。
常见错误现象:
- 光标在第一行就按
Ctrl+Enter,只建了t1,t2完全没反应 - 选中全部语句再
Ctrl+Enter,报分号语法错误 - 右键菜单里点“执行”,结果弹出“执行 SQL 语句”而非“执行 SQL 脚本”
正确执行方式:用“执行 SQL 脚本”(Alt+X 或右键菜单)
这个操作会按分号切分语句,逐条提交,每条都走独立的 JDBC execute() 调用,天然绕过多语句限制。
实操要点:
- 确保每条 DDL 结尾有英文分号
;(CREATE、DROP、ALTER都要,哪怕只有一条) - 快捷键是
Alt+X(不是Ctrl+Enter) - 右键必须选“执行”→“执行 SQL 脚本”,不是“执行 SQL 语句”
- 如果连接的是 MySQL,确认驱动参数里没强制开启
allowMultiQueries=true——开了反而容易因事务边界混乱导致部分语句回滚
跨数据库要注意的兼容性细节
不同数据库对分号和空行的容忍度不同:
- PostgreSQL:允许
;后跟空行或注释,但不能有未闭合的字符串或括号 - Oracle:DDL 默认自动提交,所以多条
CREATE之间不需要显式COMMIT;但;必须独占一行或紧跟语句后 - YashanDB:严格要求每条语句结尾是
;,且不接受语句间有空行(会解析失败) - SQL Server:T-SQL 用
GO分隔,DBeaver 不识别GO,必须换成;才能被“执行 SQL 脚本”识别
DDL 批量执行失败时最该先检查什么
别急着改语法——90% 的问题出在上下文环境上:
- 当前连接没选中数据库(报
No database selected):在 SQL 里显式写库名,比如CREATE TABLE mydb.users(...); - 某条语句依赖前一条(如先
CREATE SCHEMA s1;再CREATE TABLE s1.t1(...);),但 DBeaver 默认不保证执行顺序——把依赖强的语句往前放,或拆成两个脚本分步跑 - 权限不足(尤其
DROP或ALTER):DBeaver 不提示具体缺哪个权限,只报通用错误;建议先用命令行连上去手动试一条 - 表名/字段名含特殊字符但没加反引号:MySQL 下
`order`比order安全,否则可能被解析成关键字
真正麻烦的永远不是怎么点按钮,而是哪条语句悄悄破坏了后续执行的前提条件——批量 DDL 没有原子性,挂在哪条,就得从那条开始人工排查。


















