具有唯一约束的Postgres哈希索引

Gre*_*een 10 postgresql unique

由于Postgres 10正确支持哈希索引,我想使用哈希索引进行id查找(哈希索引的大小比btree小,理论上更快).

我有一张桌子

create table t (id int);
create unique index on t using hash (id);
Run Code Online (Sandbox Code Playgroud)

但我得到以下内容:

ERROR: access method "hash" does not support unique indexes

为什么哈希索引不允许唯一约束?有办法绕过这个吗?

kli*_*lin 11

文档不容置疑:

目前,只能将B树索引声明为唯一.

最近有关于黑客名单讨论,并得出结论,添加允许UNIQUE哈希索引的功能并不简单.


jbg*_*jbg 9

您可以使用排除约束来实现此目的:

create table t (id int);
alter table t add constraint c exclude using hash (id with =);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回复,我也得出同样的结论。“ON CONFLICT ON CONSTRAINT cnp_profiles_id_excl DO UPDATE”会导致“WrongObjectTypeError:排除约束不支持 ON CONFLICT DO UPDATE” 我无法将哈希索引与此类更新插入一起使用。 (3认同)
  • @jbg 你是怎么做 upsert 的?我遇到语法 `conn.execute( f"""INSERT INTO {TABLE_NAME} VALUES ($1, $2) ON CONFLICT (id) DO UPDATE SET value = ($2)""", hash_id, str_profile, )` 的问题我“没有与 ON CONFLICT 规范相匹配的唯一或排除约束” (2认同)