276

我正在尝试将序列设置为特定值。

SELECT setval('payments_id_seq'), 21, true

这给出了一个错误:

ERROR: function setval(unknown) does not exist

使用ALTER SEQUENCE似乎也不起作用?

ALTER SEQUENCE payments_id_seq LASTVALUE 22

如何才能做到这一点?

参考:https ://www.postgresql.org/docs/current/static/functions-sequence.html

4

6 回答 6

402

括号放错了:

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

否则,您将setval使用单个参数进行调用,而它需要两个或三个参数。

这与SELECT setval('payments_id_seq', 21)

于 2012-01-05T15:31:59.877 回答
253

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

ALTER SEQUENCE payments_id_seq LASTVALUE 22

这会起作用:

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

并且等价于:

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

更多在当前手册中的ALTER SEQUENCE序列功能

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

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 或更高版本。

于 2012-01-05T22:46:09.707 回答
55

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

setval包含3个参数:

  • 第一个参数是sequence_name
  • 第二个参数是 Nextnextval
  • 第三个参数是可选的。

setval 的第三个参数中 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是表的名称,是表idprimary key名称

于 2018-03-26T13:53:02.117 回答
9

选择 setval('sequence_name', sequence_value)

于 2012-01-05T15:31:16.923 回答
3

我不尝试通过setval. 但是使用ALTER我发出了如何正确编写序列名称。这仅对我有用:

  1. 使用检查所需的序列名称SELECT * FROM information_schema.sequences;

  2. ALTER SEQUENCE public."table_name_Id_seq" restart {number};

    就我而言,它是ALTER SEQUENCE public."Services_Id_seq" restart 8;

wiki.postgresql.org上也有一个页面,其中描述了一种生成 sql 脚本以一次修复所有数据库表中的序列的方法。在链接的文本下方:

将此保存到文件中,例如“reset.sql”

SELECT 'SELECT SETVAL(' ||
       quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
       ', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
       quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
FROM pg_class AS S,
     pg_depend AS D,
     pg_class AS T,
     pg_attribute AS C,
     pg_tables AS PGT
WHERE S.relkind = 'S'
    AND S.oid = D.objid
    AND D.refobjid = T.oid
    AND D.refobjid = C.attrelid
    AND D.refobjsubid = C.attnum
    AND T.relname = PGT.tablename
ORDER BY S.relname;

运行文件并以不包含通常标题的方式保存其输出,然后运行该输出。例子:

psql -Atq -f reset.sql -o temp
psql -f temp
rm temp

输出将是一组看起来完全像这样的 sql 命令:

SELECT SETVAL('public."SocialMentionEvents_Id_seq"', COALESCE(MAX("Id"), 1) ) FROM public."SocialMentionEvents";
SELECT SETVAL('public."Users_Id_seq"', COALESCE(MAX("Id"), 1) ) FROM public."Users";
于 2020-03-04T10:47:29.517 回答
0

这对我有用:

SELECT pg_catalog.setval('public.hibernate_sequence', 3, true);
于 2020-12-04T02:49:54.657 回答