Postgres 手动更改序列

问题描述 投票:0回答:8

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

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

sql postgresql ddl database-sequence
8个回答
520
投票

括号放错位置了:

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

否则,您将使用单个参数调用

setval
,而它需要两个或三个参数。

这与

SELECT setval('payments_id_seq', 21)

相同

278
投票

此语法在 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 或更高版本。
    


68
投票
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
    


10
投票


6
投票
setval

更改顺序。但是使用

ALTER
我被问及如何正确编写序列名称。这只对我有用:

    使用
  1. SELECT * FROM information_schema.sequences;

     检查所需的序列名称
    

  2. 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";



2
投票

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



1
投票

ALTER SEQUENCE payments_id_seq RESTART 17;


0
投票
setval

命令应该有效,我的命令不起作用,所以我使用了

pg_catalog.setval
这个对我有用:

select pg_catalog.setval('<sequence_variable_name>', <sequence_number_you_want>, true);

仅 setval 函数对我来说不起作用。

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

请参阅文档以获取更多信息

© www.soinside.com 2019 - 2024. All rights reserved.