PostgreSQL中的自动增量列?

Posted

技术标签:

【中文标题】PostgreSQL中的自动增量列?【英文标题】:auto-increment column in PostgreSQL on the fly? 【发布时间】:2016-08-19 14:32:26 【问题描述】:

我想知道是否可以动态添加一个自增整数字段,即不在CREATE TABLE 语句中定义它?

比如我有一个说法:

SELECT 1 AS id, t.type FROM t;

我可以把它改成

SELECT some_nextval_magic AS id, t.type FROM t;

我需要在 some_nextval_magic 部分动态创建自动增量字段,因为结果关系是在构建更大的 SQL 语句期间的临时id 字段的值并不重要,只要它是唯一的。

我在这里搜索,相关问题的答案(例如PostgreSQL Autoincrement)主要涉及指定SERIAL 或在CREATE TABLE 中使用nextval。但我不一定想使用CREATE TABLEVIEW(除非我必须这样做)。也有一些generate_series()的讨论,但我不确定这里是否适用。

-- 更新--

关于 PostGIS 扩展的GIS.SE answer 说明了我的动机。原来的查询是:

CREATE VIEW buffer40units AS
SELECT 
   g.path[1] as gid, 
   g.geom::geometry(Polygon, 31492) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_UNION(ST_Buffer(geom, 40)))).* 
   FROM point
) as g;

其中g.path[1] as gid 是“在 QGIS 中可视化所需的”id 字段。我相信唯一的要求是它在整个表格中是整数唯一。当g.path[] 数组为空时,我在运行上述查询时遇到了一些错误。

在尝试修复上述查询中的数组时,我想到了这个想法:

既然gid 的值无论如何都无所谓,有没有可以在这里使用的自增函数呢?

【问题讨论】:

Postgresql 具有创建序列。你可以从中得到递增的数字。 @tinlyx 你能否提供更多关于你需要的唯一性的细节......无论是在查询中本地还是在查询中全局 请发布您的代码。您已经待了这么久,知道如何提出正确的问题。根据您的语句的构造方式,有多种解决方案。如果没有更多信息,你只会得到疯狂的预感。 您需要整数吗?如果不是 md5(row_to_json(x)::text) 将用作密钥(或某种 pg_crypto 哈希) @JoeLove 和 Patrick,请查看我关于用例/要求的更新。 【参考方案1】:

如果您希望有一个 id 字段为输出中的每一行分配一个唯一整数,请使用 row_number() 窗口函数:

select 
    row_number() over () as id, 
    t.type from t;

生成的id 只会在每次查询执行中唯一。多次执行不会为id 生成新的唯一值。

【讨论】:

@tinlyx:这个数字必须有多独特?就在查询本身?还是跨多次运行查询? @Thilo,理想情况下,如果可能的话,在并发运行中是唯一的。 订单重要吗?如果没有,只需使用哈希函数

以上是关于PostgreSQL中的自动增量列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在postgresql中设置与id不同的自动增量字段

postgresql中的自定义自动增量字段(发票/订单号)

Flyway - 自动增量 ID 不适用于 PostgreSQL 中的测试数据

计算postgresql矩阵中的列组合

使用 Hibernate 注释映射 PostgreSQL 串行类型

Postgres 复制 + 增量备份