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 TABLE
或VIEW
(除非我必须这样做)。也有一些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中的自动增量列?的主要内容,如果未能解决你的问题,请参考以下文章
Flyway - 自动增量 ID 不适用于 PostgreSQL 中的测试数据