Postgresql - 使用带有改变序列表达式的子查询

Posted

技术标签:

【中文标题】Postgresql - 使用带有改变序列表达式的子查询【英文标题】:Postgresql - Using subqueries with alter sequence expressions 【发布时间】:2011-01-02 14:44:19 【问题描述】:

是否可以在 PostgreSQL 的 alter 表达式中使用子查询?

我想根据主键列值更改序列值。

我尝试使用以下表达式,但它不会执行。

alter sequence public.sequenceX restart with (select max(table_id)+1 from table)

【问题讨论】:

【参考方案1】:

我不相信你可以那样做,但你应该能够使用 setval 函数方向,这就是 alter 所做的。

select setval('sequenceX', (select max(table_id)+1 from table), false)

false 将使它返回给定的下一个序列号。

【讨论】:

正是我想要的!非常感谢! select setval('sequenceX', (select max(table_id) from table)) 将完成同样的事情,因为最后一个参数“is_call”默认为 true,但也可以正确处理您可能使用 INCREMENT BY 值以外的值创建该序列的情况1. 我需要在整个语句的末尾添加一个 from 表吗? “从子句中缺失”【参考方案2】:

此外,如果您有混合大小写的对象名称并且您收到如下错误:

ERROR: relation "public.mytable_id_seq" does not exist

...使用 regclass 的以下版本应该很有用:

select setval('"public"."MyTable_Id_seq"'::regclass, (select MAX("Id") FROM "public"."MyTable"))

【讨论】:

让我注意到双引号周围的单引号! 你绝对的英雄。我在这个问题上投入了大约 4 小时,这解决了它。谢谢!

以上是关于Postgresql - 使用带有改变序列表达式的子查询的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL citext 索引与较低的表达式索引性能

在 PostgreSQL 表中查找序列的间隙

Grafana PostgreSQL 与时间序列不同 on()

PetaPoco POCO 生成失败,序列包含多个匹配元素

需要一些带有(正则表达式)的 C# 代码,这将改变 url 域

在 PostgreSQL 列中搜索子字符串