Javascript 表的PostgreSQL项违反外键约束
我正在使用Javascript 表的PostgreSQL项违反外键约束,javascript,postgresql,foreign-keys,relational-database,sequelize.js,Javascript,Postgresql,Foreign Keys,Relational Database,Sequelize.js,我正在使用sequelize定义我的表及其关系,然后在表中插入一些条目 我有三张桌子: 银行账户:主键-账户编号 业务:主键-序列id BusinessBankAccounts:主键-BankAccountNumber和businessId 关系: BankAccount.belongsToMany(Business, {through: 'BusinessBankAccounts'}); 为银行账户和业务创建条目: Connection.models.bankAccount.create
sequelize
定义我的表及其关系,然后在表中插入一些条目
我有三张桌子:
- 银行账户:主键-账户编号
- 业务:主键-序列id
- BusinessBankAccounts:主键-BankAccountNumber和businessId
BankAccount.belongsToMany(Business, {through: 'BusinessBankAccounts'});
为银行账户和业务创建条目:
Connection.models.bankAccount.create({accountNumber: 12345678, ...});
Connection.models.business.create({...});
这两个条目正确插入到表中(使用pgAdmin检查我的数据库),但只要我尝试插入一个条目来连接这两个条目:
Connection.models.BusinessBankAccounts.create({bankAccountAccountNumber: 12345678,
businessId: 1});
将弹出一个错误:
Unhandled rejection SequelizeForeignKeyConstraintError: insert or update on table
"BusinessBankAccounts" violates foreign key constraint
"BusinessBankAccounts_bankAccountAccountNumber_fkey"
注意:使用pgAdmin工具手动插入完全相同的条目不会弹出错误,并且会插入该条目强>
任何帮助都将不胜感激
提前感谢。感谢@wildplasser的评论,我发现了如何强制提交一些插入内容 最后做了如下工作:
Connection.transaction((t)=> {
return Promise.all([
Connection.models.bankAccount.create({accountNumber: 12345678, ...},
{transaction: t}),
Connection.models.business.create({...},
{transaction: t})
]).then((result)=> {
Connection.models.BusinessBankAccounts.create({
bankAccountAccountNumber: 12345678,
businessId: 1
});
})
}
我自己在使用Sequelize和Postgres时也有同样的问题 在做了一些研究之后,我发现Postgres的“延迟”功能似乎是解决我问题的方法 你所拥有的会有用的,凯森。我的解决方案为Sequelize的事务添加了一个选项,以启用Postgres的可延迟功能,允许我插入任意多的行,并将外键约束检查延迟到事务即将提交,而不是Postgres在每个insert语句后立即检查约束。这允许我一次运行所有create语句,而不必像您所做的那样创建承诺链
var objectsToCreate = []
// all 3 of the objects you want to insert.
objectsToCreate.push({accountNumber: 12345678, ...})
objectsToCreate.push({...})
objectsToCreate.push({bankAccountAccountNumber: 12345678, businessId: 1})
await sequelize.transaction({
deferrable: sequelize.Deferrable.SET_DEFERRED // magic sauce.
}, (transaction) => {
var promises = []
objectsToCreate.forEach((objectToCreate) => {
promises.push(Connection.models.BusinessBankAccounts.create(objectToCreate, {transaction:transaction}))
})
// Here, we are able to run all the queries at one time. No having to deal with a Promise().then().then().then() chain.
return Promise.all(promises)
})
在两个插入之间提交。(pgadmin为你做了一个无形的自动提交)@wildplasser我明白了,有什么想法如何在
sequelize
中提交吗?@wildplasser请看一下我发布的答案,如果你认为解释得很好,我在接下来的两天内无法接受我自己的答案,非常感谢你的帮助。