Postgresql - 使用带有alter sequence表达式的子查询

Dan*_*xis 42 sql postgresql subquery sequence alter

我的问题很简单.

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

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

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

alter sequence public.sequenceX restart with(从表中选择max(table_id)+1)

提前致谢

Art*_*mas 75

我不相信你可以这样做,但你应该能够使用set的功能方向,这是alter的功能.

select setval('sequenceX', (select max(table_id)+1 from table), false)
Run Code Online (Sandbox Code Playgroud)

false将使它返回下一个序列号,正如给出的那样.

  • `选择SETVAL("sequenceX",(从表中选择MAX(table_id的)))`将完成同样的事情,因为最后一个参数,"is_called",默认为真,也能够正确处理这样你可能已经创建的情况下, INCREMENT BY值不是1的序列. (10认同)

Dun*_*art 6

另外,如果您混合使用大小写对象名称,并且会收到如下错误:

ERROR: relation "public.mytable_id_seq" does not exist
Run Code Online (Sandbox Code Playgroud)

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

select setval('"public"."MyTable_Id_seq"'::regclass, (select MAX("Id") FROM "public"."MyTable"))
Run Code Online (Sandbox Code Playgroud)

  • 我花了一点时间注意到双引号周围的单引号! (2认同)