Flyway迁移MySQL遇SQL语法错误,同脚本控制台执行正常
问题分析与解决方案
核心原因
错误信息里出现的uniqueidentifier类型,在你提供的Flyway DDL脚本中完全不存在,说明实际执行的不是你编写的迁移脚本,而是Hibernate自动生成的SQL。
你的配置同时开启了Flyway迁移和Hibernate的ddl-auto: create,这两个工具的表创建逻辑发生冲突:Hibernate的自动DDL功能会在应用启动时优先生成表,而它生成的SQL里使用了MySQL不支持的uniqueidentifier(这是SQL Server的字段类型),直接导致语法错误。
解决步骤
禁用Hibernate自动DDL
修改配置,将spring.jpa.hibernate.ddl-auto设为none,彻底关闭Hibernate的自动表创建逻辑,让Flyway全权负责数据库架构迁移:spring: jpa: hibernate: ddl-auto: none配置正确的MySQL方言
添加Hibernate方言配置,确保它针对MySQL生成正确的SQL语法,根据你的MySQL版本选择对应方言:spring: jpa: properties: hibernate.dialect: org.hibernate.dialect.MySQL8Dialect # 适配MySQL 8.x版本 # 若使用MySQL 5.x,改为org.hibernate.dialect.MySQL5InnoDBDialect清理冲突数据并重新迁移
- 删除数据库中所有已存在的表(包括Hibernate自动生成的表和Flyway的
schema_version表) - 重启应用,让Flyway重新执行你的DDL脚本
- 删除数据库中所有已存在的表(包括Hibernate自动生成的表和Flyway的
优化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
相关产品推荐
相关产品推荐

