将PostgreSQL主键重置为1


80

有没有一种方法可以将已填充表上的PostgreSQL表的主键重新设置为从1开始?

现在,它正在生成从1000000起的数字。我希望所有这些都重置并开始为1,以保持所有现有数据不变。

Answers:


34

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

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


14
您需要在通话前放置“ SELECT”,例如,SELECT setval('table_id_seq', 10000)
Tom

3
如果这样做SELECT setval('table_id_seq', 1),则在插入新记录时,id的值为2,而不是1。PawełGościcki的解决方案起作用。(PostgreSQL 9.3)
蓝色2014年

@bluish大概发生了什么事,就是在分配新的主键之前,即序列号增加了。您需要将其重置为0。但是我同意无论如何,其他解决方案会更好。
kralyk

185

重置序列以从1开始的最佳方法是执行以下操作:

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

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

ALTER SEQUENCE users_id_seq RESTART WITH 1

21
WITH 1参数是redundand,它可以中省略
亚采Krawczyk

这是唯一正确的答案,因为它确实重置了序列。
Balbinator

1
由CREATE TABLE子句自动生成的索引的最大问题是,我们不知道名称(后缀不是seq,可以pk等)。但是在psql上通过可以很容易\d my_table_name。或通过SQL检查,SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
Peter Krauss

3

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

INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)

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

ALTER SEQUENCE menu_number_seq RESTART

将使工作完美。

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.