我试图将一个序列设置为一个特定的值。

SELECT setval('payments_id_seq'), 21, true;

这将给出一个错误:

错误:函数setval不存在

使用ALTER SEQUENCE似乎也不工作?

ALTER SEQUENCE payments_id_seq LASTVALUE 22;

如何做到这一点呢?

裁判:https://www.postgresql.org/docs/current/functions-sequence.html


当前回答

这招对我很管用:

SELECT pg_catalog.setval('public.hibernate_sequence', 3, true);

其他回答

选择setval('sequence_name', sequence_value)

括号放错了:

SELECT setval('payments_id_seq', 21, true);  -- next value will be 22

否则,调用setval只需要一个参数,而它需要两个或三个参数。

这与SELECT setval('payments_id_seq', 21)相同

此语法在任何版本的PostgreSQL中都无效:

ALTER SEQUENCE payments_id_seq LASTVALUE

这是可行的:

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

和等价于:

SELECT setval('payments_id_seq', 22, FALSE);

更多关于ALTER SEQUENCE和SEQUENCE函数的内容请参见当前手册。

请注意,setval()期望(regclass, bigint)或(regclass, bigint, boolean)。在上面的例子中,我提供了无类型的字面量。这也有用。但是,如果将类型变量提供给函数,则可能需要显式类型转换来满足函数类型解析。如:

SELECT setval(my_text_variable::regclass, my_other_variable::bigint, FALSE);

对于重复操作,您可能会感兴趣:

ALTER SEQUENCE payments_id_seq START WITH 22; -- set default
ALTER SEQUENCE payments_id_seq RESTART;       -- without value

START [WITH]存储一个默认的RESTART号码,用于后续无值的RESTART调用。最后一部分需要Postgres 8.4或更高版本。

select setval('payments_id_seq', 21, true);

Setval包含3个参数:

第一个参数是sequence_name 第二个参数是Next nextval 第三个参数为可选参数。

setval的第3个参数中true或false的使用如下:

SELECT setval('payments_id_seq', 21);           // Next nextval will return 22
SELECT setval('payments_id_seq', 21, true);     // Same as above 
SELECT setval('payments_id_seq', 21, false);    // Next nextval will return 21

避免硬编码序列名称,下一个序列值和正确处理空列表的更好方法,您可以使用以下方式:

SELECT setval(pg_get_serial_sequence('table_name', 'id'), coalesce(max(id), 0)+1 , false) FROM table_name;

其中table_name是表的名称,id是表的主键

这招对我很管用:

SELECT pg_catalog.setval('public.hibernate_sequence', 3, true);