如何在postgresql中使用哈希方法创建主键

如何在postgresql中使用哈希方法创建主键,postgresql,hash,Postgresql,Hash,是否有任何方法可以使用哈希方法创建主键?以下两种说法都不起作用: oid char(30) primary key using hash primary key(oid) using hash 我猜,你是想用这个 主键是。一些约束可以创建索引以便正常工作(但不应依赖于这一事实)。F.ex。UNIQUE约束将创建唯一索引。请注意,目前只有B树支持唯一索引。主键约束是唯一和非空约束的组合,因此(目前)它只支持B树 如果需要(除了主键约束之外),也可以设置散列索引,但不能使其唯一 CREATE I

是否有任何方法可以使用哈希方法创建主键?以下两种说法都不起作用:

oid char(30) primary key using hash

primary key(oid) using hash

我猜,你是想用这个

主键是。一些约束可以创建索引以便正常工作(但不应依赖于这一事实)。F.ex。
UNIQUE
约束将创建唯一索引。请注意,目前只有B树支持唯一索引。
主键
约束是
唯一
非空
约束的组合,因此(目前)它只支持B树

如果需要(除了
主键
约束之外),也可以设置散列索引,但不能使其唯一

CREATE INDEX name ON table USING hash (column);
但是,如果您愿意这样做,您应该知道散列索引有一些限制(直到PostgreSQL 10):

哈希索引操作目前没有日志记录,因此,如果存在未写入的更改,则在数据库崩溃后可能需要使用REINDEX重新生成哈希索引。此外,在初始基本备份之后,对哈希索引的更改不会通过流式复制或基于文件的复制进行复制,因此它们会对随后使用它们的查询给出错误的答案。由于这些原因,目前不鼓励使用散列索引

此外:

目前,只有B-tree、GiST和GIN索引方法支持多列索引

注意:不幸的是,
oid
不是PostgreSQL中列的最佳名称,因为它也可以是列的名称


注2:。您可以使用
varchar
text
代替,使用
CHECK
约束,或者(如果id非常像uuid)本身。

为什么它们会工作?你认为“使用散列”是什么意思?您是否正在尝试设置散列索引(如果是,为什么)?你想“散列”一些数字键吗?为什么你想要一个散列索引?它有一些严重的问题,没有任何好处。@TomYeh“你认为”散列更有效吗?证据?我从来没有见过有人证明PostgreSQL不受欢迎的散列索引在任何方面都比btree好,并且经常考虑删除它们。不要猜测,不要测量。在任何情况下,不管你是否愿意,你都不能这样做。只是为了完整性:它们的性能几乎相同(如果你只想选择一行),但是btree的实际运行时间f.ex稍低一些。散列索引可能比btree提供更快的查找速度。