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

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表的索引和约束情况:

    1. 在application-test.properties中添加配置:
      spring.datasource.h2.console.enabled=true
      spring.datasource.h2.console.path=/h2-console
      
    2. 启动测试环境应用,访问http://localhost:8080/h2-console,使用配置的JDBC URL登录(通常是jdbc:h2:mem:testdb)。
    3. 找到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:25:02