将postgres自动递增值重置为0

dgenwo3n  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(529)

我有一个表,我有时在内联编辑器中输入数据,在这里我手动添加id值,通常是自动递增的。
在使用脚本自动生成id4,然后内联添加id5和id6的情况下,每当我运行insert查询时,db就会尝试自动增加值4。但值5是由用户使用内联编辑器添加到数据库中的。在这种情况下,我使用了如下脚本

SELECT SETVAL('<tableName>_id_seq', (SELECT MAX(id) FROM <tableName>));

然后自动递增值被分配给数据库当前包含的最大id值,从而成功地为insert查询自动递增。
我面临的问题是,每当我清除数据库时,是否有一种方法将自动增量值重置为0或其他值,以便下一个insert查询开始在id列中插入值为1的内容?

tpgth1q7

tpgth1q71#

下面是一个示例,说明如何使用sql从数据库中重新启动索引。我在重置用于单元测试api的实体时使用此代码。
在我的数据库中有一个表终端:

CREATE TABLE IF NOT EXISTS terminal(
    id SERIAL PRIMARY KEY,
    "serialNumber" VARCHAR(255),
    "storeCode" VARCHAR(100),
    "modelCode" VARCHAR(31)
);

它将创建一个带有主键的表 terminal_id_seq .

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');

希望有帮助。

ncecgwcz

ncecgwcz2#

看来我找到了一个方便的答案

ALTER SEQUENCE <tableName>_id_seq RESTART;

希望这有帮助

iq0todco

iq0todco3#

如上所述,有很多方法可以做到这一点,但是如果您想要一种更为幂等的方法来做到这一点(确实如此),那么我建议您: SELECT SETVAL('<tableName>_id_seq', COALESCE((SELECT MAX(id) FROM <tableName>),1)); 这样,无论表中是否有行,都可以使用相同的代码,这样做是正确的。

相关问题