重复的键值违反唯一约束 - 使用 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
。
我目前正在使用 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
。