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

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

验证步骤

  1. 启动H2控制台,使用带MODE=MySQL的URL连接数据库
  2. 直接在控制台执行修正后的建表语句,确认无报错
  3. 重新运行Spring Boot应用,触发Flyway迁移

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:45:16