【发布时间】:2011-01-02 14:44:19
【问题描述】:
是否可以在 PostgreSQL 的 alter 表达式中使用子查询?
我想根据主键列值更改序列值。
我尝试使用以下表达式,但它不会执行。
alter sequence public.sequenceX restart with (select max(table_id)+1 from table)
【问题讨论】:
标签: sql postgresql subquery sequence alter
是否可以在 PostgreSQL 的 alter 表达式中使用子查询?
我想根据主键列值更改序列值。
我尝试使用以下表达式,但它不会执行。
alter sequence public.sequenceX restart with (select max(table_id)+1 from table)
【问题讨论】:
标签: sql postgresql subquery sequence alter
我不相信你可以那样做,但你应该能够使用 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.
此外,如果您有混合大小写的对象名称并且您收到如下错误:
ERROR: relation "public.mytable_id_seq" does not exist
...使用 regclass 的以下版本应该很有用:
select setval('"public"."MyTable_Id_seq"'::regclass, (select MAX("Id") FROM "public"."MyTable"))
【讨论】: