将 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 ALTER SEQUENCE auth.roles_id_seq RESTART WITH 5;
在此处查看更好的选择:https://***.com/a/5272164/5190
自动递增的主键(即数据类型为serial primary key
的列)与sequence 关联。您可以使用setval(<seqname>, <next_value>)
函数为任何序列设置下一个值。请注意,要自己实际执行该函数,您需要使用SELECT
,如下所示:SELECT setval(<seqname>, <next_value>)
使用串口时自动创建的序列名称为<table>_<column>_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的主要内容,如果未能解决你的问题,请参考以下文章