为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关于公共T(UNAME(值(‘蒙特利尔’,2(";;SQL语句:插入t(id,name(值(4,"蒙特利尔"(【23505-197】SQL状态: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

相关内容

最新更新