Spring Boot+H2内存库Flyway迁移报错:约束未找到
问题原因与解决方法
你的问题核心是外键关联的字段必须是被关联表的主键或带有唯一约束,H2数据库严格遵循这个规则,所以当你的users表的username字段既不是主键也没有唯一约束时,创建关联它的外键就会抛出“约束未找到”的错误。
排查与修复步骤:
检查
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 );
- 如果你的设计是用
修正
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);额外注意点
- 确认Flyway迁移时使用的schema一致,避免
users表和authorities表被创建在不同的schema下 - 清理之前的H2内存数据库状态(比如重启测试,或者配置Flyway的
cleanOnValidationError临时清理,测试环境可用),再重新运行迁移
- 确认Flyway迁移时使用的schema一致,避免
内容的提问来源于stack exchange,提问作者Michu93
相关产品推荐
相关产品推荐

