重复的键值违反了唯一的约束 – 使用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 = 1
, nextval
也会生成1
。