Liquibase执行MariaDB含DELIMITER分隔符的SQL脚本失败问题求助
问题原因分析
核心问题出在Liquibase的splitStatements配置上,具体原因如下:
- 你设置了
splitStatements: true,该参数开启后Liquibase会默认以分号;作为分隔符拆分SQL文件中的所有语句,逐句提交给数据库,且不会识别SQL文件内的DELIMITER指令。你的循环逻辑属于复合语句,内部的UPDATE、END FOR等语句末尾都带分号,会被Liquibase拆成多个不完整的语法片段单独执行,自然会报错。 - 你直接在MariaDB客户端执行SQL时,客户端可以正常识别
DELIMITER //指令,会把整个循环块作为单条完整语句提交,所以可以运行成功。 - 次要问题:你提供的YAML配置缩进存在错误,
sqlFile下的encoding、path等参数缩进不规范,可能导致Liquibase无法正确识别配置项。
修复方案
- 将对应
sqlFile配置中的splitStatements改为false,让Liquibase将整个SQL文件作为单个语句块提交,不会破坏循环结构的完整性。 - 如果你的SQL文件中除了循环逻辑还有其他独立的普通SQL语句,可以把循环逻辑单独拆分到一个SQL文件中,仅为该文件配置
splitStatements: false,其他普通SQL文件保留原有配置即可。 - 修正YAML配置的缩进,保证
sqlFile下的所有子参数缩进一致,示例如下:
id: 3.36.0 comment: user deletion changes author: testuser changes: - sqlFile: encoding: utf8 path: /db-scripts-${database}/test.sql relativeToChangelogFile: true splitStatements: false
内容的提问来源于stack exchange,提问作者nee nee
相关产品推荐
相关产品推荐

