【问题标题】:Postgresql - Using subqueries with alter sequence expressionsPostgresql - 使用带有改变序列表达式的子查询
【发布时间】: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


    【解决方案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 小时,这解决了它。谢谢!
    猜你喜欢
    • 2019-02-06
    • 2018-09-24
    • 2012-07-23
    • 1970-01-01
    • 2016-01-12
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多