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

如何在H2中创建带deleted IS NULL条件的唯一索引适配软删除约束

H2 实现同等逻辑的方案

方案1:高版本H2原生支持

H2 2.1.102及以上版本已原生支持部分(过滤)唯一索引,和Postgres语法完全兼容,直接执行你原有语句即可生效:

CREATE UNIQUE INDEX index_name ON car (license_plate) WHERE deleted IS NULL;

如果运行报错,先检查H2依赖版本是否符合要求,同时可将连接串配置为jdbc:h2:mem:testdb;MODE=PostgreSQL适配Postgres语法,避免兼容模式限制特性生效。

方案2:低版本H2兼容方案(计算列+唯一约束)

如果无法升级H2版本,可通过计算列实现完全等效的逻辑:

  • 新增虚拟计算列,仅未软删除的记录会存储license_plate值,软删除记录值为null
ALTER TABLE car ADD COLUMN license_plate_active VARCHAR 
GENERATED ALWAYS AS (CASE WHEN deleted IS NULL THEN license_plate ELSE NULL END) VIRTUAL;
  • 给计算列添加唯一约束,数据库唯一约束默认允许多条记录的约束字段为null,完全匹配业务规则
ALTER TABLE car ADD CONSTRAINT uk_license_plate_active UNIQUE (license_plate_active);

其他支持原生部分唯一索引的Java可嵌入内存数据库

  • HSQLDB 2.7.0及以上版本:原生支持过滤唯一索引,语法和Postgres完全一致,可直接以内存模式运行,无需额外容器,通过JDBC连接串jdbc:hsqldb:mem:testdb即可初始化
  • SQLite 内存模式:引入sqlite-jdbc依赖即可在Java进程内启动内存实例,支持部分唯一索引,连接串为jdbc:sqlite::memory:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:45:02