向 h2 列添加唯一的、不区分大小写的索引

问题描述

有没有办法在 H2 表的列上创建唯一的不区分大小写的索引? 对于它的价值,我可以在 Postgres 中做到这一点:

create unique index unique_name_idx on my_table (UPPER(name));

解决方法

H2 只允许真正的表列作为索引组件。它不允许像 PosgreSQL 和其他高端数据库引擎那样在其中使用表达式。

但是,您可以索引计算列作为解决方法。例如:

create table t (
  id int,name varchar(20),uname varchar(20) as upper(name)
);

create unique index ix1 on t (uname);

insert into t (id,name) values
  (1,'Chicago'),(2,'Montreal'),(3,'Monterrey');

然后,如果您尝试插入:

insert into t (id,name) values
  (4,'montreal');

它按预期失败:

错误:唯一索引或主键冲突:“IX1 ON PUBLIC.T(UNAME) VALUES ('MONTREAL',2)”; SQL语句: 插入 t (id,name) 值 (4,'蒙特利尔') [23505-197] SQLState:23505 错误代码:23505

此外,索引还用于搜索信息。例如,以下 SELECT 按预期使用索引:

explain plan for
select uname from t where uname = 'MONTREAL';

执行计划:

SELECT
    UNAME
FROM PUBLIC.T
    /* PUBLIC.IX1: UNAME = 'MONTREAL' */
WHERE UNAME = 'MONTREAL'
,

考虑将列数据类型更改为 VARCHAR_IGNORECASE(不区分大小写的 VARCHAR 版本):

ALTER TABLE my_table ALTER COLUMN name VARCHAR_IGNORECASE(20);

然后你可以简单地做:

create unique index unique_name_idx on my_table (name);

http://h2database.com/html/datatypes.html#varchar_ignorecase_type