在postgres中重置自动增量计数器


232

我想将表的自动递增字段强制为某个值,我尝试使用以下方法:

ALTER TABLE product AUTO_INCREMENT = 1453

ALTER SEQUENCE product  RESTART WITH 1453;
ERROR:  relation "your_sequence_name" does not exist

我是Postgres的新手:(

我有一个表productIdname领域


5
如果是新的,为什么不使用pgAdmin并检查它将生成的命令?
Unreason

1
通常表被命名为喜欢的产品”,而不是像‘产品products_id_seq‘要确保你正在寻找一个正确的顺序’在这种情况下您的序列将被命名为喜欢。’。
亚历山大的Gorg

Answers:


309

如果您创建product具有id列的表,那么该序列将不被简单地称为product,而是product_id_seq(即${table}_${column}_seq)。

这是ALTER SEQUENCE您需要的命令:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

您可以使用\dspsql中的命令查看数据库中的序列。如果这样做,\d product并查看列的默认约束,则nextval(...)调用还将指定序列名称。


66
从此消息尚不清楚正确的语法是什么。它是:ALTER SEQUENCE product_id_seq重新启动1453;
Liron Yahdav

7
只是因为我对上述内容的解析不佳,所以这是我重申完全相同的内容的方式。语法为ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #,其中“ seq”为原义文本,并为#输入数字。不要忽略下划线。:-)
kmort

2
请注意,如果不使用公共模式,则需要在my_schema前面加上前缀。ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Daniel L. VanDenBosch

有谁知道为什么ALTER SEQUENCE product_id_seq重新启动(从产品中选择SELECT MAX(id));为什么?不行吗 我发现的唯一方法是使用两个单独的查询。
克里斯·黄·利弗

8
请注意,重新启动时使用的值是您要使用的下一个值。因此,如果您已经有一个ID为ID的记录1453,则应该这样做RESTART WITH 1454
拥抱

144

假设产品表的顺序为product_id_seq,这是您要查找的命令:

ALTER SEQUENCE product_id_seq从1453重新开始;


130

以下命令将自动为您执行此操作:这还将删除表中的所有数据。所以要小心

TRUNCATE TABLE someTable RESTART IDENTITY;

21
当心-这将删除所有数据,以及
kibibu

28
@Loolooii,只是标记它;如果某个不熟悉SQL的人在这里搜索是因为他们手动向具有自动递增字段的表中添加了一行(例如,通过ORM),则此解决方案可能不是他们期望的。
kibibu 2013年

1
TABLE关键字是多余的。TRUNCATE someTable RESTART IDENTITY;足够。
user1

知道我将如何使用CASCADE吗?
ihossain

2
@ihossain您尝试过TRUNCATE someTable RESTART IDENTITY CASCADE;吗?
Vedran

55

设置序列计数器:

setval('product_id_seq', 1453);

如果您不知道序列名称,请使用以下pg_get_serial_sequence函数:

select pg_get_serial_sequence('product', 'id');
 pg_get_serial_sequence 
------------------------
 public.product_id_seq

参数是表名和列名。

或仅\d productpsql提示时发出:

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 

14

-更改序列的起始值

ALTER SEQUENCE project_id_seq RESTART 3000;

相同但动态:

SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));

我同意使用SELECT会令人不安,但它可以正常工作。

来源:https : //kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment


如果我没记错的话,PG用last_value和is_call表示它们的序列,从(1,false)开始,然后(1,true),(2,true)...所以MAX(id)+1应该是MAX (id)而不是跳过ID。

我还必须重新启动我的postgres实例才能正常工作。brew services restart postgresql
BigRon

SELECT SETVAL('project_id_seq',(SELECT MAX(id)+1 FROM project)); 完美工作,但是有一种方法可以将增量值重置为0。因此,新条目以0索引开头?
Charith Jayasanka

13

为了方便访客,从评论转换为

从此消息尚不清楚正确的语法是什么。它是:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

6

如果要从GUI 重置自动增量,请按照以下步骤操作。

  1. 转到您的数据库
  2. 点击公开
  3. 在表格列表页面中,您可以看到类似“表格”,“视图”,“序列”的TABS
  4. 单击序列
  5. 当您单击“序列”时,您可以看到所有序列列表,然后单击要重置的任何序列
  6. 之后,您会看到多个选择,例如“更改”,“设置值”,“重新启动”,“重置”等。
  7. 然后点击重置,然后添加一个新行。

6

如果您有一个带有IDENTITY列的表,想要为其重置下一个值,则可以使用以下命令:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;

1
如果没有,sequence或者您无法截断表,则可用性一加。我认为这是最好的答案
ABS

5

要重置自动增量,您必须使用以下查询来获取序列名称。

句法:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

例:

SELECT pg_get_serial_sequence('demo', 'autoid');

该查询将返回autoid的序列名称为“ Demo_autoid_seq”, 然后使用以下查询来重置autoid

句法:

ALTER SEQUENCE sequenceName RESTART WITH value;

例:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

3

要获取序列ID,请使用

SELECT pg_get_serial_sequence('tableName', 'ColumnName');

这将为您提供序列号id为tableName_ColumnName_seq

获取最后的种子编号使用

select currval(pg_get_serial_sequence('tableName', 'ColumnName'));

或者如果您知道序列ID已经直接使用它。

select currval(tableName_ColumnName_seq);

它会给你最后一个种子号

要重置种子编号,请使用

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

1

使用此查询来检查什么是带有架构和表的序列键

SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"

使用此查询一个一个地增加增量值,

SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110

当插入表格时,下一个增加的值将用作键(111)。

使用此查询将特定值设置为增量值

SELECT setval('"SchemaName"."SequenceKey"', 120);

当插入表格时,下一个增加的值将用作键(121)。


0

请注意,如果表名带有“ _”,则会按顺序名将其删除。

例如,表名称:user_tokens列:id序列名称:usertokens_id_seq

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.