auto-increment column in PostgreSQL on the fly?
我想知道是否可以动态添加自动增量整数字段,即不在CREATE TABLE语句中定义它?
例如,我有一个声明:
1
| SELECT 1 AS id, t.type FROM t; |
而我可以将其更改为
1
| SELECT some_nextval_magic AS id, t.type FROM t; |
我需要在some_nextval_magic部分动态创建自动增量字段,因为在构造更大的SQL语句期间结果关系是临时的。并且id字段的值并不重要,只要它是唯一的。
我在这里搜索,相关问题的答案(例如PostgreSQL Autoincrement)主要涉及在CREATE TABLE中指定SERIAL或使用nextval。但我不一定要使用CREATE TABLE或VIEW(除非我必须)。还有一些关于generate_series()的讨论,但我不确定它是否适用于此。
- 更新 -
我的动机在这个关于PostGIS扩展的GIS.SE答案中得到了说明。原始查询是:
1 2 3 4 5 6 7 8 9
| 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有CREATE SEQUENCE。 你可以从中获得增量数字。
-
@tinlyx您是否可以提供有关所需唯一性的更多详细信息...无论是查询本地还是查询全局
-
请发布您的代码。 你已经足够长时间知道如何提出一个正确的问题了。 根据语句的构造方式,有各种解决方案。 如果没有更多的信息,除了野蛮的预感之外你什
-
你需要整数吗? 如果不是md5(row_to_json(x):: text)将作为一个键(或某种类型的pg_crypto哈希)
-
@JoeLove和Patrick,请参阅我关于用例/要求的更新。
-
@tinlyx您是否需要id在此查询的不同执行中保持一致? 也就是说,是否应该为特定的geom分配相同的id,或者不是?
如果你希望有一个id字段为输出中的每一行分配一个唯一的整数,那么使用row_number()窗口函数:
1 2 3
| SELECT
ROW_NUMBER() OVER () AS id,
t.type FROM t; |
生成的id在每次执行查询时都是唯一的。 多次执行不会为id生成新的唯一值。
-
@tinlyx:这个数字有多独特? 只是在查询本身? 或者跨越多次查询运行?
-
理想情况下,@ Thilo在并发运行中是唯一的,如果可能的话。
-
订单重要吗? 如果没有,只需使用哈希函数