如何在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
相关产品推荐
相关产品推荐

