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

Ooz*_*lly 3 sql postgresql h2

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

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

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;
Run Code Online (Sandbox Code Playgroud)

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

如果使用 H2 语法编写该表达式将如何形成?

The*_*ler 8

如果您愿意为此目的向表添加人为的额外列,则可以制定一种解决方法来确保“行子集上的列的唯一性”。不确定这是最好的主意,但可以完成这项工作。

例如:

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
Run Code Online (Sandbox Code Playgroud)

结果:

select * from t;

ADDRESS    DELETED  EXTRA_COLUMN
---------  -------  ------------
123 Maple       20  123 Maple   
456 Oak         25  456 Oak     
456 Oak     <null>  <null>      
Run Code Online (Sandbox Code Playgroud)