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 索引与较低的表达式索引性能
Grafana PostgreSQL 与时间序列不同 on()