如何在已有数据的情况下将PostgreSQL表的主键重置为从1开始生成?
当前主键从1000000开始生成,我希望将其重置为从1开始,同时保留现有数据。
如何在已有数据的情况下将PostgreSQL表的主键重置为从1开始生成?
当前主键从1000000开始生成,我希望将其重置为从1开始,同时保留现有数据。
将序列重置为1并重新开始的最佳方法是执行以下操作:
ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1
例如,对于users
表,应该是这样的:
ALTER SEQUENCE users_id_seq RESTART WITH 1
查看更好的选项,请点击此链接:https://dev59.com/am865IYBdhLWcg3wa-A0#5272164
自增主键(即数据类型为 serial primary key
的列)与一个序列相关联。您可以使用 setval(<seqname>, <next_value>)
函数设置任何序列的下一个值。请注意,要执行该函数本身,您需要使用SELECT
,例如: SELECT setval(<seqname>, <next_value>)
当使用serial时,自动创建的序列名称为 <table>_<column>_seq
。
SELECT setval('table_id_seq', 10000)
。 - TomSELECT setval('table_id_seq', 1)
,当我插入新记录时,id的值会变成2而不是1。Paweł Gościcki的解决方案可行。(PostgreSQL 9.3) - bluishTRUNCATE TABLE table_name RESTART IDENTITY;
也许有些用户和我一样需要这个操作。
@bluish实际上,使用自增主键插入新记录,就像明确使用序列一样:
INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)
因此,如果你想让第一个id为1,你需要将序列设置为0。但是这超出了范围,所以你必须使用ALTER SEQUENCE语句。例如,如果你的表menu中有一个名为number的序列字段:
ALTER SEQUENCE menu_number_seq RESTART
将使工作完美。
delete from population
ALTER SEQUENCE population_id_seq" RESTART WITH 1
@ZootHii TRUNCATE TABLE table_name RESTART IDENTITY CASCADE;
删除表table_name并重置自增ID,同时级联删除关联表数据。
WITH 1
参数是冗余的,可以省略。 - Jacek Krawczykseq
,而是pk
等)。但是在psql上通过\d my_table_name
很容易解决。或者通过SQL查询,SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
。 - Peter KraussWITH 1
或者省略它。如果您指定了WITH 123
或任何当前最高值,它将把该值添加到下一行。这可能不是您想要的结果。 - Owen AllenALTER SEQUENCE auth.roles_id_seq RESTART WITH 5;
。 - JackLeEmmerdeur