【问题标题】:Postgres complains id 'already exists' after insert of initial data?Postgres 在插入初始数据后抱怨 id '已经存在'?
【发布时间】:2017-11-26 06:33:23
【问题描述】:

我有一个问题,即 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 更新计数器的正确方法是什么?

顺便说一句,使用 Postgres 9.6

【问题讨论】:

  • 另见Serial Types
  • 链接文章中描述的行为与我们在此处看到的一致。那就是手动指定 id 值不会更新序列。只有DEFAULT 会增加值,因此刷新序列似乎很重要。这与 MySQL 不同,例如,MySQL 根据列中的最大值自动递增。

标签: postgresql


【解决方案1】:

经过一番搜索,事实证明这将完成我需要做的事情。

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

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

SELECT pg_get_serial_sequence('patients', 'id')

唯一需要注意的是,您忽略了“公众”。部分返回值。

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

【讨论】:

  • 我得到“users_id_seq 不存在”
【解决方案2】:

在您最初插入数据之前尝试删除表,它可能会从之前的运行中持续存在,在这种情况下,(1,“bob”)在您尝试再次添加之前已经在您的表中。

【讨论】:

  • 问题不是在初始添加期间,而是在之后的正常操作期间。所有具有指定 id 的值都正确添加,但不是具有 DEFAULT id 的值。从 psql 命令行对此进行模拟表明使用 ids 插入不会更新列的增量器。
  • 我明白了,我的错误。我对 postgres 不太熟悉,无法评论如何跟踪需要自动生成的下一个 id 值
【解决方案3】:

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

【讨论】:

    【解决方案4】:
    SELECT setval('users_id_seq', (SELECT MAX(id) from users));
    

    序列的名称是自动生成的,并且始终是 tablename_columnname_seq。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多