Postgres中如何重置自增计数器

406

我想将表的自增字段强制设置为某个值,我尝试了这个:

ALTER TABLE product AUTO_INCREMENT = 1453

并且

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

我有一个名为product的表格,其中包含Idname字段。


5
为什么不使用pgAdmin并检查它将生成的命令? - Unreason
2
通常表格的名称是像“products”而不是像“product”。在这种情况下,您的序列将被命名为“products_id_seq”。确保您正在寻找正确的序列。 - Alexander Gorg
18个回答

542
如果你创建了带有id列的表product,那么序列名称不仅仅是product,而是product_id_seq (也就是 ${table}_${column}_seq)。
这是你需要的ALTER SEQUENCE命令:
ALTER SEQUENCE product_id_seq RESTART WITH 1453

您可以使用psql中的\ds命令查看数据库中的序列。如果您执行\d product并查看列的默认约束,那么nextval(...)调用也将指定序列名称。


71
从这条消息中并不清楚正确的语法是什么。它是: ALTER SEQUENCE product_id_seq RESTART WITH 1453; - Liron Yahdav
14
由于我解析上面的内容不太好,以下是我重新表述相同意思的方式。语法为ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #,其中"seq"是字面文本,您需要为#填入一个数字。不要忽略下划线。 :-) - kmort
10
请注意,如果不使用公共模式,需要在前面加上“my_schema”。ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453 - Daniel L. VanDenBosch
22
请注意,您重新开始的值是您想要使用的下一个值。因此,如果您已经有一个ID为1453的记录,则应该使用RESTART WITH 1454 - hughes
4
有了“IDENTITY”列约束,您可以使用以下命令修改表格中的ID列起始值为1453:ALTER TABLE tbl ALTER COLUMN id RESTART WITH 1453。 - Bastien Durel
显示剩余7条评论

193

以下命令可以自动完成此操作:这也将删除表中的所有数据。因此请小心。

TRUNCATE TABLE someTable RESTART IDENTITY;

49
请注意 - 这将删除所有您的数据。 - kibibu
37
@Loolooii,只是提醒一下;如果有人因为手动向带有自增字段的表中添加了一行(例如通过ORM),而在此搜索并不熟悉SQL,则这个解决方案可能不是他们所期望的。 - kibibu
2
TABLE 关键字是多余的。TRUNCATE someTable RESTART IDENTITY; 就足够了。 - user1
10
你尝试过使用TRUNCATE someTable RESTART IDENTITY CASCADE;吗? - Vedran
3
对于被引用的表,您可以执行 TRUNCATE table2, table1 RESTART IDENTITY; - Zeeshanef

168

假设您的产品表的序列为product_id_seq,以下是您要寻找的命令:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

70

设置序列计数器:

setval('product_id_seq', 1453);

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

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

这些参数是表名和列名。

或者在 psql 提示符下输入 \d product

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

1
SELECT setval('product_id_seq', 1453); 对我起作用了。 - Lukasz Puchala
我正在尝试选择pg_get_serial_sequence('Domain.products','id');但是出现模式不存在的错误。我该如何运行此查询?我是psql新手。 - mehul9595

53

1
如果我没记错的话,PG用last_value和is_called来表示他们的序列,从(1, false)开始,然后是(1, true),(2, true)...所以MAX(id)+1应该是MAX(id),否则会跳过一个id。 - Ten
我还需要重新启动我的Postgres实例才能使其工作。brew services restart postgresql - BigRon
选择SETVAL('project_id_seq',(选择MAX(id) + 1从项目中));工作得很好但是否有一种方法将增量值重置为0。因此,新条目从0索引开始? - Charith Jayasanka
不需要加“+1”,只需使用“MAX(column_name)”即可。如果添加“+1”,则会跳过序列中的一个值。 - Dima L.

20

要将它设置为下一个最高的值,您可以使用:

SELECT SETVAL(pg_get_serial_sequence('table_name', 'column_name'), (SELECT MAX(column_name) FROM table_name));

最有用的答案。谢谢! - Ulvi
1
这对我来说最合适。但是请确保在max()函数中加上+1。即:SELECT SETVAL(pg_get_serial_sequence('table_name', 'column_name'), (SELECT MAX(column_name) + 1 FROM table_name)); - Siddharth Venu
不需要添加“+1”,只需使用“MAX(column_name)”即可。如果添加“+1”,则会跳过序列中的一个值。 - Dima L.

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

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

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

5
如果没有“序列(sequence)”或者无法截断表格(table),则可增加可用性。我认为这是最佳答案。 - ABS

17

为方便访客而转换自评论

从这条消息中并不清楚正确的语法是什么。正确的语法是:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

14

2021年,Postgres 11.12

ALTER SEQUENCE 对我没有起作用,它以某种方式将其重置为 null

适用于我的是:

SELECT setval('<table>_<column>_seq', 5);

它对我也适用于Postgres 12.8,谢谢。 - Pere Joan Martorell

11

如果您想从GUI中重置自动增量,请按照以下步骤进行。

  1. 进入您的数据库
  2. 点击Public
  3. 在表列表页面上,您可以看到像“Tables”、“Views”、“Sequences”之类的选项卡
  4. 点击Sequences
  5. 当您单击“Sequences”时,您可以看到所有序列清单,点击任何一个您想要重置的序列
  6. 之后,您可以看到多个选项,例如“Alter”、“Set Value”、“Restart”、“Reset”等...
  7. 然后点击Reset,然后添加一行新数据。

1
这在DBeaver上运行得很好。非常感谢。我不明白为什么开发人员总是喜欢把事情搞得复杂化! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接