将 PostgreSQL 主键重置为 1

Posted

技术标签:

【中文标题】将 PostgreSQL 主键重置为 1【英文标题】:Reset PostgreSQL primary key to 1 【发布时间】:2011-04-18 16:06:37 【问题描述】:

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

现在它正在生成 1000000 及以上的数字。我希望它全部重置并从 1 开始,保持我所有现有数据的完整性。

【问题讨论】:

【参考方案1】:

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

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

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

ALTER SEQUENCE users_id_seq RESTART WITH 1

【讨论】:

WITH 1参数是多余的,可以省略 这是唯一正确的答案,因为它确实重置了序列。 CREATE TABLE子句自动生成的索引的大问题,就是我们不知道名字(而且后缀不是seq,可以pk等.)... 但是通过\d my_table_name 在 psql 上很容易。或通过 SQL 检查,SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%' 在这个问题上打我的头。如果表中有数据并且您希望它从上次停止的地方开始,您仍然希望传递WITH 1 或将其忽略。如果您指定WITH 123 或任何当前最高值,它将将该值添加到您的下一行。可能不是你想要的。 我需要在序列标识符前面加上模式名称,否则我得到“关系'tablename_id_seq'不存在”。这个命名约定可以通过 "\d " 和 id 列的默认值 (nextval...) 来查找。所以基本上就我而言ALTER SEQUENCE auth.roles_id_seq RESTART WITH 5;【参考方案2】:

在此处查看更好的选择:https://***.com/a/5272164/5190

自动递增的主键(即数据类型为serial primary key 的列)与sequence 关联。您可以使用setval(&lt;seqname&gt;, &lt;next_value&gt;) 函数为任何序列设置下一个值。请注意,要自己实际执行该函数,您需要使用SELECT,如下所示:SELECT setval(&lt;seqname&gt;, &lt;next_value&gt;)

使用串口时自动创建的序列名称为&lt;table&gt;_&lt;column&gt;_seq

【讨论】:

您需要在调用前加上“SELECT”,例如SELECT setval('table_id_seq', 10000) 如果我这样做SELECT setval('table_id_seq', 1),当我插入一条新记录时,id 的值为 2,而不是 1。Paweł Gościcki's solution 有效。 (PostgreSQL 9.3) @bluish 大概是在分配新的主键之前序列号增加了,即。您需要将其重置为 0。但我同意其他解决方案更好。【参考方案3】:

TRUNCATE TABLE table_name RESTART IDENTITY;

【讨论】:

【参考方案4】:

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

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

所以,如果你想让第一个 id 为 1,你应该将你的序列设置为 0。但是它超出了界限,所以你必须使用 ALTER SEQUECE 语句。 因此,如果您的表格菜单中有一个名为 number 的序列字段,例如:

ALTER SEQUENCE menu_number_seq RESTART

将完美地完成这项工作。

【讨论】:

以上是关于将 PostgreSQL 主键重置为 1的主要内容,如果未能解决你的问题,请参考以下文章

如何在不明确指定主键的情况下使用 Dapper Extensions 将对象插入 PostGreSql?

SQL Server数据库表重置自增主键号(通常是指ID)

删除所有实例后,Django 模型实例主键不会重置为 1

重新排序/重置自动增量主键

重新排序/重置自动增量主键

重新排序/重置自动增量主键