postgresql Postgres手动更改序列

gtlvzcf8  于 2023-02-15  发布在  PostgreSQL
关注(0)|答案(7)|浏览(353)

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

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/functions-sequence.html

kqlmhetl

kqlmhetl1#

括号放错了位置:

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

否则,您将使用单个参数调用setval,而它需要两个或三个参数。
这与SELECT setval('payments_id_seq', 21)相同

6xfqseft

6xfqseft2#

此语法在 * any * 版本的PostgreSQL中无效:

ALTER SEQUENCE payments_id_seq LASTVALUE 22

这是可行的:

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

并相当于:

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

有关ALTER SEQUENCEsequence functions的详细信息,请参阅 * 当前 * 手册。
注意setval()需要(regclass, bigint)(regclass, bigint, boolean)。在上面的例子中,我提供了 * untyped literal *。这也可以。但是如果你给函数输入类型变量,你可能需要显式的类型转换来满足函数类型解析。比如:

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

pw9qyyiw

pw9qyyiw3#

使用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是表的primary key

mm9b1k5b

mm9b1k5b4#

选择setval('序列名称',序列值)

r7xajy2e

r7xajy2e5#

我没有尝试通过setval更改序列。但使用ALTER时,我遇到了如何正确写入序列名的问题。这只对我有效:
1.使用SELECT * FROM information_schema.sequences;检查所需序列名称

  1. 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";
bis0qfac

bis0qfac6#

这对我很有效:

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

iibxawm47#

这一条对我很有效:

select pg_catalog.setval('<sequence_variable_name>', <sequence_number_you_want>, true);

setval函数本身对我不起作用。

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

See the docs for more info

相关问题