【发布时间】:2011-04-18 16:06:37
【问题描述】:
有没有办法将 PostgreSQL 表的主键重置为在填充表上重新从 1 开始?
现在它正在生成 1000000 及以上的数字。我希望它全部重置并从 1 开始,保持我所有现有数据的完整性。
【问题讨论】:
标签: postgresql primary-key reset
有没有办法将 PostgreSQL 表的主键重置为在填充表上重新从 1 开始?
现在它正在生成 1000000 及以上的数字。我希望它全部重置并从 1 开始,保持我所有现有数据的完整性。
【问题讨论】:
标签: postgresql primary-key reset
重置序列以从数字 1 开始的最佳方法是执行以下操作:
ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1
因此,例如对于users 表,它将是:
ALTER SEQUENCE users_id_seq RESTART WITH 1
【讨论】:
WITH 1参数是多余的,可以省略
seq,可以pk等.)... 但是通过\d my_table_name 在 psql 上很容易。或通过 SQL 检查,SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
WITH 1 或将其忽略。如果您指定WITH 123 或任何当前最高值,它将将该值添加到您的下一行。可能不是你想要的。
ALTER SEQUENCE auth.roles_id_seq RESTART WITH 5;在此处查看更好的选择:https://stackoverflow.com/a/5272164/5190
自动递增的主键(即数据类型为serial primary key 的列)与sequence 关联。您可以使用setval(<seqname>, <next_value>) 函数为任何序列设置下一个值。请注意,要自己实际执行该函数,您需要使用SELECT,如下所示:SELECT setval(<seqname>, <next_value>)
使用串口时自动创建的序列名称为<table>_<column>_seq
【讨论】:
SELECT setval('table_id_seq', 10000)
SELECT setval('table_id_seq', 1),当我插入一条新记录时,id 的值为 2,而不是 1。Paweł Gościcki's solution 有效。 (PostgreSQL 9.3)
TRUNCATE TABLE table_name RESTART IDENTITY;
【讨论】:
@bluish 实际上使用自动递增的主键插入新记录,就像以这种方式显式使用序列一样:
INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)
所以,如果你想让第一个 id 为 1,你应该将你的序列设置为 0。但是它超出了界限,所以你必须使用 ALTER SEQUECE 语句。 因此,如果您的表格菜单中有一个名为 number 的序列字段,例如:
ALTER SEQUENCE menu_number_seq RESTART
将完美地完成这项工作。
【讨论】: