在清空表格后,序列不会重置。

40

我在清空表格后,使用 SELECT lastval() 获取到错误的序列号。

当我清空表格时,使用 SELECT lastval() 会得到错误的ID。

7个回答

99

使用 SQL 命令 TRUNCATE

对于单个表,语法如下:

TRUNCATE TABLE table_name RESTART IDENTITY;

对于多个表:

TRUNCATE TABLE table_foo, table_bar RESTART IDENTITY;

功能:

自动重新启动被截断表的列所拥有的序列。

详见:TRUNCATE @ postgresql.org


错误:在“RESTART”附近有语法错误 第1行:截断表product RESTART IDENTITY; - user1369887
@user1369887 你使用的是哪个版本的PostgreSQL? - Ihor Romanchenko
我的服务器版本是:server 8.3.16。 - user1369887
1
版本8.4.9也会发生类似的事情。 以下语句不会重置序列值: TRUNCATE TABLE my_table RESTART IDENTITY; - Wojtas
1
@Wojtas 仔细阅读答案。它已经声明,它只会重置被截断表的列所拥有的序列。 - Ihor Romanchenko

24

以下是重置序列的标准方法:

truncate table table_name restart identity;

但在某些版本和平台上,它是语法错误。

在这种情况下,您可以截断而不是重置序列,并使用另一个SQL更改序列,请尝试以下操作:

truncate table table_name;
alter sequence seq_name start 1;

8

将序列重置为从数字1重新开始的最佳方法是在成功截断序列后执行以下操作:

ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1

因此,例如对于用户表,它将是:

ALTER SEQUENCE users_id_seq RESTART WITH 1

1
感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其长期价值,并使其对未来读者具有其他类似问题更有用。请编辑您的答案以添加解释,包括您所做的假设。 - Toby Speight
帮忙了。谢谢 :) - Srijwal R

5

尝试这个:

TRUNCATE TABLE 表名 RESTART IDENTITY CASCADE;


除非你知道它的作用并且确定这就是你想要做的,否则不要级联。 - Storm Muller

4

请检查下一个

ALTER SEQUENCE sequence_name RESTART WITH 1;

2

如果你想要重置序列,那么:

setval('sequence_name', 0)

要列出现有的序列名称,请在psql提示符下输入\ds


请注意,对于字段序列的编程识别,有一个名为pg_get_serial_sequence的函数。选择pg_get_serial_sequence('tablename','colname'); - Scott Marlowe
错误的ID意味着它并非实际生成的ID值。 - user1369887

0

您可以使用以下SQL语句来在PostgreSQL中重置标识:

TRUNCATE TABLE table_name RESTART IDENTITY;

但请注意,无法在Redshift中重新设定identity。重置Redshift的方法是删除并重新创建表格。


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