微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决向 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。