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请看一下我发布的答案,如果你认为解释得很好,我在接下来的两天内无法接受我自己的答案,非常感谢你的帮助。