ChatGPT解决这个技术问题 Extra ChatGPT

Postgres 手动更改序列

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

SELECT setval('payments_id_seq'), 21, true

这给出了一个错误:

错误:函数 setval(unknown) 不存在

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

ALTER SEQUENCE payments_id_seq LASTVALUE 22

如何才能做到这一点?

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

看起来 setval() 至少有两个参数。

C
Chris

括号放错了:

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

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

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


最后一个参数“真”是什么意思?
true 表示下一个值将是提供的数字 + 1,在本例中为 22。false 表示下一个值将是提供的数字,即 21。默认情况下,setval 的行为就像 true 是选择。更多详情:postgresql.org/docs/9.6/static/functions-sequence.html
select setval 语法优于 alter sequence 的一个优点是您可以在其中使用嵌套查询,例如 select max(id) from payments
@mariotomo 这是一个很好的观点,并且是通过将序列号设置为低于当前最大值来确保您不会意外引入潜在错误的最简单方法之一
E
Erwin Brandstetter

此语法在任何版本的 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)。在上面的例子中,我提供了无类型文字。这也有效。但是,如果您将类型变量提供给函数,您可能需要显式 type casts 来满足函数类型解析。喜欢:

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


ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table); 不起作用,而 SELECT setval('sequence', (SELECT (MAX(col) from table), TRUE); 起作用。我收到语法错误。 (Postgres 9.4)
DDL 命令(“实用程序命令”)中不允许子查询。请参阅:stackoverflow.com/a/36025963/939860
@MitalPritmani:您可能需要类型转换。考虑上面添加的说明。
@NuclearPeon 我认为您的意思是 SELECT setval('sequence', (SELECT MAX(col) from table), TRUE); 否则您的括号不会对齐。
@dland:除此之外:更短的 &更快的等价物:SELECT setval('seq', max(col)) FROM tbl; 请参阅:stackoverflow.com/a/23390399/939860
V
VaibsVB

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

setval 包含 3 个参数:

第一个参数是 sequence_name

第二个参数是下一个 nextval

第三个参数是可选的。

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 是表的名称,id 是表的 primary key


谢谢!最后一个表达式正是我想要的。它允许我保留序列值以便之后批量插入。
r
rogerdpack

选择 setval('sequence_name', sequence_value)


a
alanextar

我不尝试通过 setval 更改顺序。但是使用 ALTER 我被告知如何正确编写序列名称。这仅对我有用:

使用 SELECT * FROM information_schema.sequences 检查所需的序列名称; 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";

S
Salvatore Pannozzo Capodiferro

这对我有用:

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