在插入初始数据后,Postgres抱怨id'已经存在'?

时间:2017-06-22 20:10:59

标签: postgresql

我有一个问题,Postgres在导入一些初始数据后抱怨重复的ID,我试图看看如何增加id列计数器?

详细说明:

我最近将一些初始数据上传到Postgres表中,其中id设置为Sequelize模型定义中的自动增量。例如:

    sequelize.define('user', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        name: Sequelize.STRING
    }

数据插页如下:

INSERT INTO "users" ("id","name") VALUES(1, "bob");
INSERT INTO "users" ("id","name") VALUES(2, "brooke");
INSERT INTO "users" ("id","name") VALUES(3, "nico");

现在,当我尝试插入新记录时,我的node.js应用程序会抱怨Key (id)=(1) already exists。 SQL Sequelize使用的格式为:

INSERT INTO "users" ("id","name") VALUES(DEFAULT, "nico");

如果我是空的记录表并再次尝试或重试操作足够多次,那么我看到计数器确实增加了。问题似乎是Postgres无法根据记录来判断当前的最大ID是什么?

在将初始数据上传到数据库后,告诉Postgres更新计数器的正确方法是什么?

BTW使用Postgres 9.6

3 个答案:

答案 0 :(得分:8)

经过一番搜索后发现这将完成我需要做的事情。

SELECT setval('users_id_seq', max(id)) FROM users;

此代码会将id设置为表中的当前最大ID,此处为users表。注意,要检查序列是否与列相关联,这将起作用:

SELECT pg_get_serial_sequence('patients', 'id')

唯一需要注意的是你忽略了'公众'。部分返回值。

我会将setval()添加到我的初始数据脚本中。

答案 1 :(得分:0)

尝试在最初插入数据之前删除表,它可能会在之前的运行中保持不变,在您再次添加它之前,表格(1,“bob”)已经存在于您的表中。

答案 2 :(得分:0)

这发生在我身上,因为我使用文字、数值(而不是 DEFAULT 或未定义)作为自动递增列的参数插入了记录。这样做绕过了列的 underlying sequence object 的增量调用,从而使序列的值与表中列中的值不同步。