我正在尝试将一个序列设置为一个特定值。
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
7条答案
按热度按时间kqlmhetl1#
括号放错了位置:
否则,您将使用单个参数调用
setval
,而它需要两个或三个参数。这与
SELECT setval('payments_id_seq', 21)
相同6xfqseft2#
此语法在 * any * 版本的PostgreSQL中无效:
这是可行的:
并相当于:
有关
ALTER SEQUENCE
和sequence functions的详细信息,请参阅 * 当前 * 手册。注意
setval()
需要(regclass, bigint)
或(regclass, bigint, boolean)
。在上面的例子中,我提供了 * untyped literal *。这也可以。但是如果你给函数输入类型变量,你可能需要显式的类型转换来满足函数类型解析。比如:对于重复操作,您可能会感兴趣:
START [WITH]
存储一个默认的RESTART
号码,用于后续的RESTART
调用,没有值。最后一部分需要Postgres 8.4或更高版本。pw9qyyiw3#
使用
select setval('payments_id_seq', 21, true);
setval
包含3个参数:sequence_name
nextval
setval的第3个参数中true或false的使用如下:
避免硬编码序列名、下一个序列值以及正确处理空列表格的更好方法是使用以下方法:
其中
table_name
是表的名称,id
是表的primary key
mm9b1k5b4#
选择setval('序列名称',序列值)
r7xajy2e5#
我没有尝试通过
setval
更改序列。但使用ALTER
时,我遇到了如何正确写入序列名的问题。这只对我有效:1.使用
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”
运行文件并以不包含常见头文件的方式保存输出,然后运行该输出。例如:
输出将是一组SQL命令,看起来完全像这样:
bis0qfac6#
这对我很有效:
iibxawm47#
这一条对我很有效:
setval函数本身对我不起作用。
See the docs for more info