H2数据库执行含复合主键的INSERT语句失败求助
解决H2数据库中复合主键表插入时的唯一索引冲突问题
检查acting表的Schema定义
确认schema.sql中acting表的复合主键和外键定义是否正确,避免误添加了media_id字段的单独唯一约束。例如,正确的表结构应该类似:CREATE TABLE acting ( media_id BIGINT NOT NULL, actor_id BIGINT NOT NULL, is_starring INT NOT NULL, -- 复合主键定义 PRIMARY KEY (media_id, actor_id), -- 外键关联,不要添加UNIQUE约束到单个字段 FOREIGN KEY (media_id) REFERENCES media(id), FOREIGN KEY (actor_id) REFERENCES actor(id) );如果你在定义外键时意外添加了
UNIQUE(比如FOREIGN KEY (media_id) REFERENCES media(id) UNIQUE),或者单独写了UNIQUE(media_id),就会导致media_id值不能重复,触发你遇到的唯一索引冲突。查看H2中的实际表结构
启用H2控制台,直接检查acting表的索引和约束情况:- 在
application-test.properties中添加配置:spring.datasource.h2.console.enabled=true spring.datasource.h2.console.path=/h2-console - 启动测试环境应用,访问
http://localhost:8080/h2-console,使用配置的JDBC URL登录(通常是jdbc:h2:mem:testdb)。 - 找到acting表,查看其索引列表,确认是否存在仅针对
media_id的唯一索引。如果存在,说明schema定义有误,需要删除该单独的唯一约束。
- 在
确认Schema执行顺序
确保schema.sql中表的创建顺序正确:先创建media、person、actor表,再创建acting表。错误的创建顺序可能导致H2对约束的解析异常,引发意外的索引问题。配置H2兼容MySQL模式
Spring Boot 3.x中,H2的默认兼容性模式可能和MySQL有差异,你可以在application-test.properties中设置H2兼容MySQL模式:spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=MySQL这可以让H2的SQL解析和约束行为更贴近MySQL,避免因兼容性问题导致的约束异常。
内容的提问来源于stack exchange,提问作者JuiceWizard
相关产品推荐
相关产品推荐

