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

Spring Boot中Flyway未创建Hello表却执行数据插入的问题排查

Flyway迁移问题排查:V1脚本未创建表但V2执行成功

问题场景

在Spring Boot配置服务应用中,通过Flyway管理数据库迁移:

  • resource/db/migration/V1__Create_Hello.sql 用于创建hello表
  • resource/db/migration/V2_Insert_properties.sql 向手动创建的property表插入数据

目前V2的数据插入操作正常,但hello表未被创建,flyway_schema_history显示迁移记录存在(用户提供截图佐证)。

相关代码与配置

V1__Create_Hello.sql 脚本

CREATE TABLE hello (
        id INT AUTO_INCREMENT PRIMARY KEY,
        app VARCHAR(255) NOT NULL,
        key VARCHAR(255) NOT NULL,
        value TEXT,
        UNIQUE KEY unique_property (app, key)
);

V2_Insert_properties.sql 脚本

INSERT INTO property (app,key, value) VALUES ('app', ‘key1’, ‘va’l1);

application.yml 配置

spring:
  application:
    name: config-server
  profiles:
    active: jdbc
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: "${MYSQL_URL:jdbc:mysql://localhost:3306/myDB}"
    username: "${MYSQL_USERNAME:root}"
    password: "${MYSQL_PASSWORD:root}"
  flyway:
      enabled: true
      baseline-on-migrate: true
      locations: "classpath:db/migration"
  cloud:
    config:
      server:
        jdbc:
          sql: SELECT property_key, property_value FROM property WHERE application = ? and profile = ? and label = ?
          order : 1
        encrypt:
          enabled: true
  jpa:
    show-sql: true
server:
  port: 8088

management:
  endpoints:
    web:
      exposure:
        include: "*"

问题原因分析

  1. SQL语法错误(核心原因)
    key是MySQL的保留关键字,在V1脚本中直接将其作为列名使用,会导致CREATE TABLE语句执行失败。部分场景下Flyway可能会将脚本标记为"执行成功"(如错误未被正确捕获或日志未输出),但实际表并未创建。

  2. V2脚本的潜在语法问题
    V2脚本中使用了中文全角引号(‘key1’),且va’l1中的单引号未转义,这会导致SQL执行报错,但用户反馈V2执行正常,推测是输入时的笔误,需修正避免后续问题。

  3. 日志缺失导致问题定位困难
    默认日志级别下,Flyway的执行细节未完全输出,无法直观看到V1脚本的执行错误。

解决方案

1. 修正V1脚本的保留关键字问题

将key列名用MySQL反引号(`)包裹,转义保留关键字:

CREATE TABLE hello (
        id INT AUTO_INCREMENT PRIMARY KEY,
        app VARCHAR(255) NOT NULL,
        `key` VARCHAR(255) NOT NULL,
        value TEXT,
        UNIQUE KEY unique_property (app, `key`)
);

2. 修正V2脚本的引号问题

替换中文全角引号为英文半角引号,并转义特殊字符:

-- 如果值是val1
INSERT INTO property (app,`key`, value) VALUES ('app', 'key1', 'val1');

-- 如果值是va'l1,需转义单引号
INSERT INTO property (app,`key`, value) VALUES ('app', 'key1', 'va\'l1');

3. 修复Flyway迁移历史并重新执行

  • 若flyway_schema_history中V1版本已被标记为成功,需手动删除该版本记录;
  • 执行Flyway的repair命令修复历史记录(或直接重启应用,配合baseline-on-migrate配置);
  • 添加日志配置,查看Flyway执行细节:
logging:
  level:
    org.flywaydb: DEBUG

4. 验证迁移结果

重启应用后,查看数据库中是否创建了hello表,同时检查flyway_schema_history中的迁移状态是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:22:36