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

Spring Boot+H2内存库Flyway迁移报错:约束未找到

问题原因与解决方法

你的问题核心是外键关联的字段必须是被关联表的主键或带有唯一约束,H2数据库严格遵循这个规则,所以当你的users表的username字段既不是主键也没有唯一约束时,创建关联它的外键就会抛出“约束未找到”的错误。

排查与修复步骤:

  1. 检查V1.0.0__create_user_table.sql的表定义
    打开这个脚本,确认username字段的配置:

    • 如果你的设计是用username作为用户的唯一标识,那应该把它设为主键:
      CREATE TABLE users (
          username VARCHAR(50) PRIMARY KEY,
          password VARCHAR(100) NOT NULL,
          enabled BOOLEAN NOT NULL
      );
      
    • 如果用户表用自增ID作为主键,那必须给username加上唯一约束,确保它是唯一的:
      CREATE TABLE users (
          id BIGINT AUTO_INCREMENT PRIMARY KEY,
          username VARCHAR(50) NOT NULL UNIQUE,
          password VARCHAR(100) NOT NULL,
          enabled BOOLEAN NOT NULL
      );
      
  2. 修正V1.0.1__create_authorities_table.sql的外键定义
    确保外键关联的字段和users表的username字段类型、长度完全一致,比如:

    CREATE TABLE authorities (
        username VARCHAR(50) NOT NULL,
        authority VARCHAR(50) NOT NULL,
        PRIMARY KEY (username, authority),
        FOREIGN KEY (username) REFERENCES users(username)
    );
    

    或者用ALTER TABLE方式添加外键(前提是users表的username已经有主键/唯一约束):

    CREATE TABLE authorities (
        username VARCHAR(50) NOT NULL,
        authority VARCHAR(50) NOT NULL,
        PRIMARY KEY (username, authority)
    );
    
    ALTER TABLE authorities
    ADD CONSTRAINT fk_authorities_users
    FOREIGN KEY (username) REFERENCES users(username);
    
  3. 额外注意点

    • 确认Flyway迁移时使用的schema一致,避免users表和authorities表被创建在不同的schema下
    • 清理之前的H2内存数据库状态(比如重启测试,或者配置Flyway的cleanOnValidationError临时清理,测试环境可用),再重新运行迁移

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:10:17