ste*_*tef 149 postgresql database-sequence
我正在尝试将序列设置为特定值.
SELECT setval('payments_id_seq'), 21, true
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误:
ERROR: function setval(unknown) does not exist
使用ALTER SEQUENCE似乎也不起作用?
ALTER SEQUENCE payments_id_seq LASTVALUE 22
Run Code Online (Sandbox Code Playgroud)
如何才能做到这一点?
参考:https://www.postgresql.org/docs/current/static/functions-sequence.html
NPE*_*NPE 195
括号错位:
SELECT setval('payments_id_seq', 21, true); # next value will be 22
Run Code Online (Sandbox Code Playgroud)
否则你setval用一个参数调用,而它需要两个或三个.
Erw*_*ter 161
此语法在任何版本的PostgreSQL中无效:
ALTER SEQUENCE payments_id_seq LASTVALUE 22Run Code Online (Sandbox Code Playgroud)
这可行:
ALTER SEQUENCE payments_id_seq RESTART WITH 22;
Run Code Online (Sandbox Code Playgroud)
并相当于:
SELECT setval('payments_id_seq', 22, FALSE);
Run Code Online (Sandbox Code Playgroud)
更多当前手册ALTER SEQUENCE和序列功能.
请注意,setval()期望(regclass, bigint)或者(regclass, bigint, boolean).在上面的例子中,我提供了无类型的文字.这也有效.但是,如果将类型变量提供给函数,则可能需要显式类型转换以满足函数类型解析.喜欢:
SELECT setval(my_text_variable::regclass, my_other_variable::bigint, FALSE);
Run Code Online (Sandbox Code Playgroud)
对于您可能感兴趣的重复操作:
ALTER SEQUENCE payments_id_seq START WITH 22; -- set default
ALTER SEQUENCE payments_id_seq RESTART; -- without value
Run Code Online (Sandbox Code Playgroud)
START [WITH]存储一个默认RESTART号码,用于RESTART没有值的后续呼叫.最后一部分需要Postgres 8.4或更高版本.
Vai*_*sVB 24
使用 select setval('payments_id_seq', 21, true);
setval 包含3个参数:
sequence_namenextval在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
Run Code Online (Sandbox Code Playgroud)
避免序列名,下一个序列值的硬编码和正确处理空列表的更好方法,您可以使用以下方式:
SELECT setval(pg_get_serial_sequence('table_name', 'id'), coalesce(max(id), 0)+1 , false) FROM table_name;
Run Code Online (Sandbox Code Playgroud)
这里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;
wiki.postgresql.org上还有一个页面,其中描述了一种生成 sql 脚本以同时修复所有数据库表中的序列的方法。下面是链接中的文字:
将其保存到文件中,例如“reset.sql”
Run Code Online (Sandbox Code Playgroud)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;运行该文件并以不包含常用标头的方式保存其输出,然后运行该输出。例子:
Run Code Online (Sandbox Code Playgroud)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";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
141431 次 |
| 最近记录: |