我正在尝试将序列设置为特定值。
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
括号放错位置了:
SELECT setval('payments_id_seq', 21, true); -- next value will be 22
否则,您将使用单个参数调用
setval
,而它需要两个或三个参数。
这与
SELECT setval('payments_id_seq', 21)
相同
此语法在 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 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
nextval
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
setval
更改顺序。但是使用
ALTER
我被问及如何正确编写序列名称。这只对我有用:
SELECT * FROM information_schema.sequences;
检查所需的序列名称
ALTER SEQUENCE public."table_name_Id_seq" restart {number};
就我而言,是ALTER SEQUENCE public."Services_Id_seq" restart 8;
上还有一个页面,其中描述了一种生成 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;
运行文件并以不包含以下内容的方式保存其输出 通常的标题,然后运行该输出。示例:输出将是一组 sql 命令,如下所示:
psql -Atq -f reset.sql -o temp psql -f temp rm temp
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";
SELECT pg_catalog.setval('public.hibernate_sequence', 3, true);