Spring Boot启动H2数据库Flyway迁移脚本报JdbcSQLSyntaxErrorException
解决H2+Flyway下MySQL风格建表语句UNIQUE KEY语法错误问题
核心原因
H2的MySQL兼容模式并非完全复刻MySQL语法,UNIQUE KEY的写法如果不符合H2兼容规则,就会触发语法解析错误。
解决步骤
1. 启用H2的MySQL兼容模式
在Spring Boot数据源配置中,给H2 URL添加MODE=MySQL参数,搭配必要的兼容参数,确保H2以MySQL语法规则解析SQL:
# application.properties 示例配置 spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL;DATABASE_TO_LOWER=TRUE;DB_CLOSE_DELAY=-1 spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa spring.datasource.password=
MODE=MySQL:强制H2切换为MySQL语法解析模式DATABASE_TO_LOWER=TRUE:将表名、列名转为小写,匹配MySQL默认行为
2. 修正UNIQUE KEY的写法
根据约束类型调整语句:
- 单列唯一约束:两种正确写法二选一
错误写法(缺括号导致报错):
正确写法:CREATE TABLE user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255), UNIQUE KEY username );-- 方式1:列定义后直接追加UNIQUE CREATE TABLE user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) UNIQUE ); -- 方式2:带索引名的UNIQUE KEY(推荐,便于后续维护) CREATE TABLE user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255), UNIQUE KEY idx_unique_username(username) ); - 多列联合唯一约束:必须指定索引名,并用括号包裹列列表
正确写法:CREATE TABLE user_role ( user_id BIGINT, role_id BIGINT, PRIMARY KEY (user_id, role_id), UNIQUE KEY idx_unique_user_role(user_id, role_id) );
3. 配置Flyway适配MySQL方言
如果Flyway仍报错,强制指定SQL方言为MySQL,确保Flyway以MySQL规则处理迁移脚本:
spring.flyway.sql-dialect=org.flywaydb.core.internal.database.mysql.MySQLDialect
验证步骤
- 启动H2控制台,使用带
MODE=MySQL的URL连接数据库 - 直接在控制台执行修正后的建表语句,确认无报错
- 重新运行Spring Boot应用,触发Flyway迁移
内容的提问来源于stack exchange,提问作者Susanna Michael
相关产品推荐
相关产品推荐

