将PostgreSQL主键重置为1

Dav*_*vid 66 postgresql primary-key reset

有没有办法将PostgreSQL表的主键重置为在填充的表上再次从1开始?

现在它正在产生1000000及以上的数字.我想要全部重置并从1开始,保持我现有的所有数据不变.

Paw*_*cki 152

重置序列以使用数字1重新开始的最佳方法是执行以下操作:

ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1
Run Code Online (Sandbox Code Playgroud)

因此,例如对于users表格,它将是:

ALTER SEQUENCE users_id_seq RESTART WITH 1
Run Code Online (Sandbox Code Playgroud)

  • `WITH 1`参数是冗余的,可以省略 (16认同)
  • 由 CREATE TABLE 子句自动生成的索引的 **大问题** 是我们不知道名称(并且后缀不是 `seq`,可以是 `pk` 等)...但是通过 on 很容易psql 通过 `\d my_table_name`。或者通过 SQL 检查,`SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'` (2认同)
  • 只是在这个问题上让我头疼。如果表中有数据并且您希望它从上次停止的地方开始,您仍然需要传递“WITH 1”或将其省略。如果您指定“WITH 123”或任何当前最高值,它将将该值添加到下一行。可能不是你想要的。 (2认同)

Vin*_*vic 32

自动增量的主键(即具有数据类型的列serial primary key)与序列相关联.您可以使用该setval(<seqname>, <next_value>)函数为任何序列设置下一个值.请注意,要实际执行该功能,您需要使用SELECT,如下所示:SELECT setval(<seqname>, <next_value>)

使用serial时自动创建序列的名称 <table>_<column>_seq

  • 你需要在调用前加上"SELECT",例如`SELECT setval('table_id_seq',10000)` (13认同)
  • 如果我做`SELECT setval('table_id_seq',1)`,当我插入一条新记录时,id取值为2而不是1. [PawełGościcki的解决方案](http://stackoverflow.com/a/5272164/505893 )工作.(PostgreSQL 9.3) (3认同)

Zoo*_*Hii 17

TRUNCATE TABLE table_name RESTART IDENTITY;

这将删除您的所有数据。

也许有些用户像我一样正在寻找类似的东西。


小智 5

@bluish实际上使用自动递增主键插入新记录,就像这样显式使用序列一样:

INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)
Run Code Online (Sandbox Code Playgroud)

因此,如果您希望第一个 id 为 1,则必须将序列设置为 0。但它超出了范围,因此您必须使用 ALTER SEQUECE 语句。因此,如果您的表格菜单中有一个名为 number 的序列字段,例如:

ALTER SEQUENCE menu_number_seq RESTART
Run Code Online (Sandbox Code Playgroud)

将使工作变得完美。