重复的键值违反唯一约束 - 使用 KnexJS 和 Postgresql

duplicate key value violates unique constraint - Using KnexJS, with Postgresql

我目前正在使用 KnexJS 框架构建一个应用程序,该框架帮助我在开发中编写 sqlite3,在生产中编写 postgresql(针对 Heroku)。

我的主要问题是我的应用程序在我的机器上运行良好,但一旦我将它上传到 heroku,它就会中断。在 Heroku 日志中,我收到消息:

{ error: insert into "contracts" ("contract_desc", "contract_header", "owner_id", "signee_id") values (, , , ) - duplicate key value violates unique constraint "contracts_pkey"

这让我无法将数据插入我的数据库。

我的 table Knex 迁移设置如下:

exports.up = function(knex, Promise) {
  return knex.schema.createTable('contracts', function (table) {
    table.increments('id').primary()
    table.integer('owner_id')
    table.integer('signee_id')
    table.string('contract_header')
    table.text('contract_desc')
    table.string('signature_url')
    table.string('date_signed')
    table.boolean('isSigned')
      })
   };

exports.down = function(knex, Promise) {
  return knex.schema.dropTable('contracts')
};

我调用的用于插入数据的函数如下所示:

function newContract (id, contractDetails) {
  return knex('contracts')
  .select('owner_id', 'signee_id', 'contract_header', 'contract_desc')
  .insert({
    owner_id: id,
    signee_id: contractDetails.signee_id,
    contract_header: contractDetails.contract_header,
    contract_desc:contractDetails.contract_desc
  })
}

关于可能导致此问题的原因有什么想法吗?

好的,我知道了。

尝试从种子中删除 id 字段。

让我解释一下为什么会这样

Postgres 自动增量字段的值来自 sequences

您可以在psql界面尝试\d <table_name>命令。它会给你类似

...
 id         | bigint                   | not null default nextval('<table_name>_id_seq'::regclass)
...

通过

insert into table_name (name) values ('Kappa')

您实际上省略了 id 字段并插入 default 值,即 nextval('<table_name>_id_seq').

通过在查询中明确指定您的 id 参数,您不会使用此函数,下次使用它时 - 您可能会遇到 ID 冲突。您插入了 id = 1 并且 nextval 也生成了 1