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

Flyway迁移MySQL遇SQL语法错误,同脚本控制台执行正常

问题分析与解决方案

核心原因

错误信息里出现的uniqueidentifier类型,在你提供的Flyway DDL脚本中完全不存在,说明实际执行的不是你编写的迁移脚本,而是Hibernate自动生成的SQL。

你的配置同时开启了Flyway迁移和Hibernate的ddl-auto: create,这两个工具的表创建逻辑发生冲突:Hibernate的自动DDL功能会在应用启动时优先生成表,而它生成的SQL里使用了MySQL不支持的uniqueidentifier(这是SQL Server的字段类型),直接导致语法错误。

解决步骤

  1. 禁用Hibernate自动DDL
    修改配置,将spring.jpa.hibernate.ddl-auto设为none,彻底关闭Hibernate的自动表创建逻辑,让Flyway全权负责数据库架构迁移:

    spring:
      jpa:
        hibernate:
          ddl-auto: none
    
  2. 配置正确的MySQL方言
    添加Hibernate方言配置,确保它针对MySQL生成正确的SQL语法,根据你的MySQL版本选择对应方言:

    spring:
      jpa:
        properties:
          hibernate.dialect: org.hibernate.dialect.MySQL8Dialect # 适配MySQL 8.x版本
          # 若使用MySQL 5.x,改为org.hibernate.dialect.MySQL5InnoDBDialect
    
  3. 清理冲突数据并重新迁移

    • 删除数据库中所有已存在的表(包括Hibernate自动生成的表和Flyway的schema_version表)
    • 重启应用,让Flyway重新执行你的DDL脚本
  4. 优化JDBC配置(可选但推荐)

    • 替换旧版驱动:将driver-class-name改为com.mysql.cj.jdbc.Driver(适配MySQL 8.x)
    • JDBC URL添加时区参数:
      spring:
        flyway:
          url: "jdbc:mysql://127.0.0.1:3306/xxx?useSSL=false&serverTimezone=UTC"
        datasource:
          hikari:
            jdbc-url: jdbc:mysql://127.0.0.1:3306/xxx?useSSL=false&serverTimezone=UTC
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:47:54