将 Postgres 自动增量值重置为 0
Reset Postgres auto-increment value to 0
我有一个 table,有时我会在内联编辑器中输入数据,我会在其中手动添加通常自动递增的 id 值。
在使用脚本自动生成 id 4 然后内联添加 id 5 和 6 的情况下,每当我 运行 插入查询时,数据库都会尝试自动增加值 4。但是值5 已由用户使用内联编辑器添加到数据库中。在这种情况下,我使用了如下脚本
SELECT SETVAL('<tableName>_id_seq', (SELECT MAX(id) FROM <tableName>));
然后自动递增值被分配给数据库当前包含的最大id值,从而成功地为插入查询自动递增。
我面临的问题是,每当我清除数据库时,是否有一种方法可以将自动增量值重置为 0 或其他值,以便下一个插入查询将开始向 id 插入值 1专栏?
这是我 sql 从我的数据库重新启动索引的示例。
我在重置实体以对我的 api.
进行单元测试时使用此代码
在我的数据库中我有一个 table 终端:
CREATE TABLE IF NOT EXISTS terminal(
id SERIAL PRIMARY KEY,
"serialNumber" VARCHAR(255),
"storeCode" VARCHAR(100),
"modelCode" VARCHAR(31)
);
它将创建一个带有主键 terminal_id_seq
的 table。
ALTER SEQUENCE terminal_id_seq RESTART WITH 1;
DELETE FROM terminal;
--redo the inserts
INSERT INTO terminal ("id", "serialNumber", "storeCode","modelCode") VALUES (10,'abc','def','blabla');
希望对您有所帮助。
我的问题似乎找到了方便的答案
ALTER SEQUENCE <tableName>_id_seq RESTART;
希望对您有所帮助
如上所述,有多种方法可以做到这一点,但如果您想要一种更幂等的方法(您就是这样做的),那么我建议:
SELECT SETVAL('<tableName>_id_seq', COALESCE((SELECT MAX(id) FROM <tableName>),1));
这样,无论 table 中是否有行,您都可以使用相同的代码,并且它会做正确的事情。
我有一个 table,有时我会在内联编辑器中输入数据,我会在其中手动添加通常自动递增的 id 值。
在使用脚本自动生成 id 4 然后内联添加 id 5 和 6 的情况下,每当我 运行 插入查询时,数据库都会尝试自动增加值 4。但是值5 已由用户使用内联编辑器添加到数据库中。在这种情况下,我使用了如下脚本
SELECT SETVAL('<tableName>_id_seq', (SELECT MAX(id) FROM <tableName>));
然后自动递增值被分配给数据库当前包含的最大id值,从而成功地为插入查询自动递增。
我面临的问题是,每当我清除数据库时,是否有一种方法可以将自动增量值重置为 0 或其他值,以便下一个插入查询将开始向 id 插入值 1专栏?
这是我 sql 从我的数据库重新启动索引的示例。 我在重置实体以对我的 api.
进行单元测试时使用此代码在我的数据库中我有一个 table 终端:
CREATE TABLE IF NOT EXISTS terminal(
id SERIAL PRIMARY KEY,
"serialNumber" VARCHAR(255),
"storeCode" VARCHAR(100),
"modelCode" VARCHAR(31)
);
它将创建一个带有主键 terminal_id_seq
的 table。
ALTER SEQUENCE terminal_id_seq RESTART WITH 1;
DELETE FROM terminal;
--redo the inserts
INSERT INTO terminal ("id", "serialNumber", "storeCode","modelCode") VALUES (10,'abc','def','blabla');
希望对您有所帮助。
我的问题似乎找到了方便的答案
ALTER SEQUENCE <tableName>_id_seq RESTART;
希望对您有所帮助
如上所述,有多种方法可以做到这一点,但如果您想要一种更幂等的方法(您就是这样做的),那么我建议:
SELECT SETVAL('<tableName>_id_seq', COALESCE((SELECT MAX(id) FROM <tableName>),1));
这样,无论 table 中是否有行,您都可以使用相同的代码,并且它会做正确的事情。