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

我目前正在使用KnexJS框架构build一个应用程序,该框架可以帮助我在开发中编写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 }) } 

任何想法可能会导致这一点?

好的,我明白了。

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

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

Postgres自动增量字段从序列中获取它们的值

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

 ... 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