问题描述
有没有办法在 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