H2 - 创建具有两列的唯一索引

H2 - Create unique index with two columns

目前我正在使用 postgres 查询创建两个唯一索引。

每个索引由两列组成,其中检查一列的值是否为 null/not null:

CREATE UNIQUE INDEX deleted_not_null_idx 
ON user (ADDRESS, DELETED)
WHERE DELETED IS NOT NULL;

CREATE UNIQUE INDEX deleted_null_idx 
ON user (ADDRESS)
WHERE DELETED IS NULL;

我正尝试在 H2 上做同样的事情,但我在理解 H2 的语法和结构时遇到问题。

如果使用 H2 语法编写,这个表达式将如何构成?

如果您愿意为 table 添加一个人为的额外列,则可以制定出确保 "uniqueness of the columns on a subset of rows" 的解决方法,只是为了这个目的。不确定这是不是最好的主意,但可以胜任。

例如:

create table t (
  address varchar(20),
  deleted int,
  extra_column varchar(20) as
    case when deleted is null then null else address end,
  constraint uq1 unique (extra_column)
);

insert into t (address, deleted) values ('123 Maple', 20);
insert into t (address, deleted) values ('456 Oak', 25);
insert into t (address, deleted) values ('456 Oak', null); -- succeeds
insert into t (address, deleted) values ('456 Oak', 28); -- fails

结果:

select * from t;

ADDRESS    DELETED  EXTRA_COLUMN
---------  -------  ------------
123 Maple       20  123 Maple   
456 Oak         25  456 Oak     
456 Oak     <null>  <null>