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

Posted

技术标签:

【中文标题】如何在 postgresql 中使用哈希方法创建主键【英文标题】:How to create a primary key using the hash method in postgresql 【发布时间】:2014-08-25 10:20:09 【问题描述】:

有什么方法可以使用哈希方法创建主键?以下两种说法均无效:

oid char(30) primary key using hash

primary key(oid) using hash

【问题讨论】:

它们为什么会起作用?您认为“使用哈希”是什么意思?您是否尝试设置散列索引(如果是,为什么)?您是在尝试“散列”一些数字键吗? 为什么需要哈希索引?它有一些严重的问题,没有任何好处。 @TomYeh“你认为”哈希更有效吗?证据?我从未见过有人表明 PostgreSQL 相当不受欢迎的哈希索引在任何方面都比 btree 更好,并且经常考虑将它们删除。不要猜测,测量。无论如何,不​​管你愿不愿意,你都做不到。 只是为了完整性:它们的执行几乎相同(如果您只想选择 1 行),但 btree 的实际运行时间稍低,f.ex。 sqlfiddle.com/#!15/37175/1 哈希索引可以提供比 btree 更快的查找,也许是around 40% faster。 【参考方案1】:

我假设,您打算使用 hash index method / type。

主键是constraints。 一些 约束可以创建索引以正常工作(但不应依赖这一事实)。前任UNIQUE 约束将创建一个唯一索引。请注意,目前只有 B-tree 支持唯一索引PRIMARY KEY 约束是 UNIQUENOT NULL 约束的组合,因此(目前)它仅支持 B-tree。

如果需要,您也可以设置哈希索引(PRIMARY KEY 约束除外)——但您不能使其唯一。

CREATE INDEX name ON table USING hash (column);

但是,如果你愿意这样做,你应该知道哈希索引有一些限制(直到 PostgreSQL 10):

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

还有:

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

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

注 2char(n) type is also discouraged。您可以使用 varchartext 代替 CHECK 约束 - 或(如果 id 非常类似于 uuid)uuid type 本身。

【讨论】:

哈希索引操作是 WAL 记录的,从 PostgreSQL 10 开始。

以上是关于如何在 postgresql 中使用哈希方法创建主键的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 哈希索引

Postgresql 创建主键并设置自动递增的三种方法

PostgreSQL - 如何从“选择不同”查询创建“维度”表并创建主键和外键?

如何在 PostgreSQL 中添加外键

如何使用 SQLAlchemy 创建一个不是主键的标识列?

使用 clsql 在 postgresql 中自动生成主键