【问题标题】:add a unique, case-insensitive index to a h2 column向 h2 列添加唯一的、不区分大小写的索引
【发布时间】:2021-09-28 18:58:22
【问题描述】:

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

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

【问题讨论】:

  • 也许是 VARCHAR_IGNORECASE 数据类型和唯一索引?
  • @jarlh 我认为您的解决方案比我的要好。这应该是公认的答案。

标签: sql constraints h2


【解决方案1】:

考虑将列数据类型更改为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

【讨论】:

    【解决方案2】:

    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] 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'
    

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 2011-12-18
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 2012-12-26
      相关资源
      最近更新 更多