我正在尝试将序列设置为特定值。
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
答案 0 :(得分:147)
括号错位:
SELECT setval('payments_id_seq', 21, true); # next value will be 22
否则你用一个参数调用setval
,而它需要两个或三个。
答案 1 :(得分:147)
此语法在任何版本的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
和sequence functions的当前手册中的更多内容。
请注意,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或更高版本。
答案 2 :(得分:15)
使用select setval('payments_id_seq', 21, true);
setval
包含3个参数:
sequence_name
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
答案 3 :(得分:8)
setval('sequence_name', sequence_value)
答案 4 :(得分:1)
我不尝试通过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";
答案 5 :(得分:0)
这对我有用:
SELECT pg_catalog.setval('public.hibernate_sequence', 3, true);