如何在超过 12 的 postgres 版本上自动生成 Oid

Posted

技术标签:

【中文标题】如何在超过 12 的 postgres 版本上自动生成 Oid【英文标题】:How to automatically generate Oids on postgres versions over 12 【发布时间】:2020-10-14 05:21:06 【问题描述】:

我目前正在将我团队的数据库从 postgres 10 迁移到 postgres 13。我的团队正在设计一个基于 java 的应用程序,该应用程序是基于 postgres 构建的,因此我们不想迁移数据库,而只是编辑这样的代码我们的程序与postgres 13兼容。有没有自动生成oid的命令?这是我们当前与 postgres 10 兼容但不兼容 13 的代码

        String createTable = "CREATE TABLE IF NOT EXISTS tableorders (" +
                "tablename    TEXT NOT NULL," +
                "ordername TEXT NOT NULL," +
                "rowIdxTable TEXT, " +
                "colIdxTable TEXT, " +
                "PRIMARY KEY (tablename, ordername)" +
                "UNIQUE (oid))" +
        //postgres13 does not support this line
                "WITH oids";
                ") ";

所以我想做的是找到一种方法来自动为每个节点生成一个在 postgres 上唯一的标识,并消除使我们的程序与 postgres 13 不兼容的 oid

【问题讨论】:

OID 已被弃用近 15 年,为什么还要使用它们?但是为什么不直接使用 IDENTITY(或序列)列呢? 【参考方案1】:

您应该使用名为oidbigint 类型的标识列,您的程序将继续像以前一样工作。

如果您想要数据库范围内的唯一性,那么最近删除的oids 确实没有提供。这些数字取自一个 4 字节无符号计数器,该计数器在 2^32 之后环绕(尽管如果列具有唯一索引,PostgreSQL 会避免在单个表中出现重复数字)。

oid 列的数据库范围唯一性可以通过使用单个序列为所有此类列提供值来轻松实现。

【讨论】:

以上是关于如何在超过 12 的 postgres 版本上自动生成 Oid的主要内容,如果未能解决你的问题,请参考以下文章

postgres_dba 小工具

如何在 9.414 版本中使用 executemany 忽略 postgres 中的重复项?

如何使用窗口函数仅在 POSTGRES 中选择不超过某个值的行

自动将 csv 转储到新的 Postgres 表中[重复]

用postgres在一行中处理多个布尔项目?

如何让 pcp 自动将节点附加到 postgres pgpool?