You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flyway 7.15.0解析SQL不完整致迁移失败,应切换至哪个版本?

问题解决建议

核心原因

Flyway 7.15.0在解析包含嵌套WHILE块的MySQL存储过程时,会错误地将第一个END WHILE识别为整个SQL脚本的结束符,导致后续代码无法被正确解析,进而抛出语法错误。

两种解决方案

方案1:使用自定义语句分隔符(无需切换版本)

在迁移SQL文件开头添加自定义分隔符声明,让Flyway正确识别存储过程的边界:

DELIMITER //

DROP PROCEDURE IF EXISTS updateIndex;
CREATE PROCEDURE updateIndex()
BEGIN
DECLARE key1_value INT DEFAULT 0;
DECLARE tname varchar(30);
DECLARE loopNum INT DEFAULT 1;
DECLARE i INT DEFAULT 1;
DECLARE flag INT DEFAULT 1;
DECLARE tmp_result CURSOR FOR select key1, name,count(*) from test_flyway group by key1,name having count(*) > 1;
DECLARE EXIT HANDLER FOR NOT FOUND SET flag = 0;
OPEN tmp_result;
WHILE flag = 1 DO
FETCH tmp_result INTO key1_value, tname, loopNum;
    WHILE i < loopNum DO
        UPDATE test_flyway set name = CONCAT(name,'(', i,')')   WHERE   id = ( SELECT tmp.id FROM ( SELECT id from test_flyway WHERE key1 = key1_value and name = tname LIMIT 1 ) tmp );
        SET i = i + 1;
    END while;
    SET i = 1;
END while;
END //

DELIMITER ;

通过DELIMITER //将语句分隔符临时改为//,存储过程定义结束后再改回默认的;,就能避免Flyway误解析嵌套的END WHILE。

方案2:切换Flyway版本

如果必须通过版本升级解决,推荐升级到Flyway 8.0.0及以上版本。Flyway 8.x系列对MySQL存储过程的语法解析逻辑进行了优化,修复了嵌套块的边界识别问题,能正确处理这类包含多层WHILE的存储过程脚本。

内容的提问来源于stack exchange,提问作者Colin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:12:10