【问题标题】:PostgreSQL: starting a sequence at MAX(the_column)+1PostgreSQL:从 MAX(the_column)+1 开始一个序列
【发布时间】:2016-05-05 18:23:28
【问题描述】:

我想将一个序列添加到可能已经有数据的列中,所以我试图在已经存在的内容之外启动它。假设已经有数据,我想这样做:

CREATE SEQUENCE my_sequence MINVALUE 1000000 START
    (SELECT MAX(id_column) FROM my_table) OWNED BY my_table.id_column;

但它一直在 ( 声称语法错误。就好像起始值必须是冷硬数字——没有任何象征意义。

当然,如果序列足够智能以避免重复值,则更好的解决方案是,因为id_column 对其具有独特的约束——这就是我这样做的原因。但据我所知,这是不可能的。

我也尝试跳过START 然后做:

ALTER SEQUENCE my_sequence RESTART WITH (SELECT max(id_column)+1 FROM my_table);

但是,再一次,它似乎不像是符号开始值。

我正在运行 PostgreSQL 9.4,但我们的一些客户正在使用像 8.3 这样原始的东西。

【问题讨论】:

    标签: postgresql sequence unique-constraint


    【解决方案1】:

    您不能为起始值指定动态值。

    但是您可以在创建序列后设置值:

    CREATE SEQUENCE my_sequence MINVALUE 1000000 OWNED BY my_table.id_column;
    select setval('my_sequence',  (SELECT MAX(id_column) FROM my_table));
    

    【讨论】:

    • 太棒了...我正要编辑它以添加 MAX(id_column)+1 以便序列开始超出最大值,但是当我测试它时,它确实从最大 @987654324 之后的 1 开始@!所以我猜START 1000000 的真正意思是“从 1000001 开始”。
    • 我无法确认 Opux 所说的;我必须做 MAX + 1。
    • @Noumenon 可能与序列的 is_called 列有关。如果false,下一次调用nextval() 将返回序列的当前值。如果is_calledtrue,则序列将在返回新值之前递增。调用setval时,可以指定第三个参数设置is_called,但默认为true。换句话说,setval('my_sequence', (SELECT MAX(id_column) FROM my_table)); 应该总是导致未来的默认设置为“从最大的id_column 之后的 1 开始”。从 v7.2 开始,这似乎是正确的。 postgresql.org/docs/7.2/functions-sequence.html
    【解决方案2】:

    您可以按要求恢复您的序列:

    select setval('my_sequence', (SELECT MAX(id_column) FROM my_table));
    

    适用于 Postgres 9.2。

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 2019-10-15
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 2021-04-24
      相关资源
      最近更新 更多