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

时间:2017-07-04 08:41:56

标签: javascript node.js postgresql heroku knex.js

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

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

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

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

表格的我的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
  })
}

关于可能导致这种情况的任何想法?

1 个答案:

答案 0 :(得分:4)

好的,我明白了。

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

让我解释为什么会发生这种情况

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

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

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

通过

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

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

通过在查询中明确指定您的id参数,您不使用此功能,并在下次使用时 - 您可以获得ID的冲突。您还插入了id = 1nextval生成的1