HANA:如何在已索引的列上添加唯一约束?

HANA: How to add a unique contraint on a column that is already indexed?

具有以下架构:

CREATE TABLE test_table(
    cryptid varchar(255) 
);
CREATE INDEX cryptid_index ON test_table (cryptid);

我正在尝试对列进行唯一约束。

ALTER TABLE test_table ADD constraint crypid_unique_contraint UNIQUE(cryptid);

但这会出错:

Could not execute 'ALTER TABLE test_table ADD constraint crypid_unique_contraint ...'
Error: (dberror) [261]: invalid index name: column list already indexed

我可以理解该列已被索引,因为我自己创建了索引。但我希望该列是唯一的。有办法吗?

您可以查看 INDEXES 系统视图上的文档。他们列出了这种索引类型:

Type of row store indexes: BTREE, BTREE_UNIQUE, CPBTREE, and CPBTREE_UNIQUE.

“简单”索引和唯一索引在构建时是不同的索引类型,因此在声明索引后无法更改它。 在其他数据库中,当您添加 unique 约束时,它会创建一个新的唯一索引(如在 T-SQL 或 MySQL 或 Postgers 中)或对该列重用当前索引(如在 Oracle 中) .但是 HANA 不允许您在同一列上创建以太附加索引(由于未知原因,我没有找到它的文档)或使用现有索引强制执行约束(由于唯一性和索引类型的混合实现不佳)。

唯一的方法是删除现有索引并从头开始将其创建为唯一(从元数据的角度来看,它相当于唯一约束),由于授权,您不能这样做。伤心但是...

这确实是当前 HANA 版本中未记录的限制。

在此列上创建唯一约束的唯一方法是首先删除此列上存在的单列索引。

我认为这没有记录为 (docu-)bug。但是,现有索引通常不能重复用于唯一性检查这一事实并非如此。 HANA 的列存储中的单列索引(这是您默认使用的)table 是 而不是 B 树索引。相反,这些是列存储 table 列的 主存储 部分的列存储结构的倒排索引。
这些倒置结构无法像 B 树索引那样容易地在当前事务上下文中检查重复项。

我相信这就是
的原因 a) 仅对列存储中的特定索引实现实施唯一性检查,

b) 使系统行为(不允许将现有索引“转换”为唯一索引)在所有 table 类型中保持一致。

作为一般性评论:对于列存储 table,单列索引对 lookup/point-read 场景的好处通常不值得额外的存储和计算资源消耗。这种类型的索引实际上 双倍 索引列的内存需求。因此,查找特定值的加速应该值得这种额外的永久资源消耗。