【问题标题】:Batch INSERT on multiple queries is throwing foreign key violation对多个查询进行批量 INSERT 会引发外键违规
【发布时间】:2019-01-17 11:13:19
【问题描述】:

我正在关注this 进行批量 INSERT 有两个查询。第一个查询插入到<tableone>,第二个查询插入到<tabletwo>

第二个表有一个引用<tableone> 的外键约束。

以下代码是我如何处理批量插入

batchQuery.push(
  insertTableOne,
  insertTableTwo
);

const query = pgp.helpers.concat(batchQuery);
db.none(query)

insertTableOne 看起来像

INSERT INTO tableone (id, att2, att3) VALUES 
(1, 'a', 'b'), (2, 'c', 'd'), (3, 'e', 'f'), ...

insertTableTwo 看起来像

INSERT INTO tabletwo (id, tableone_id) VALUES 
(10, 1), (20, 2), (30, 3), ...

<tabletwo>有一个限制

CONSTRAINT fk_tabletwo_tableone_id
  FOREIGN KEY (tableone_id)
  REFERENCES Tableone (id)

db.none(query) 我收到了violates foreign key constraint "fk_tabletwo_tableone_id"

上面的查询不是按顺序执行的吗?先插入表一,再插入表二?

这是如何提交查询的问题吗?我也尝试过使用上面链接页面中示例所示的交易。

有什么想法吗?

【问题讨论】:

  • 您应该首先记录所有正在执行的查询,这样您就可以看到确切的顺序。然后你可以在 pgAdmin 中重新运行它,看看你的问题出在哪里。然后就有可能弄清楚如何解决它。使用pg-monitor 获取所有查询,或至少获取事件query
  • 查询事件帮助我识别导致此问题的 SQL 错误。刚刚安装了 pg-monitor。惊人的!谢谢。

标签: postgresql pg-promise


【解决方案1】:

如果您通读spex.batch() 方法的文档(链接示例中的pgp.helpers.concat() 方法使用该方法),则说明values 参数:

混合值数组(可以为空),待解析 异步的,没有特定的顺序。

http://vitaly-t.github.io/spex/global.html#batch

您可能需要查看另一种方法,而不是使用batch()

我建议在第一次插入完成后使用.then() 链接依赖查询,即。类似db.none(insertTableOne).then(() => db.none(insertTableTwo))

【讨论】:

  • 他的问题不在于方法batch,而在于没有正确链接依赖项。他需要找到他破坏依赖链的地方,并修复它。顺便说一句,batch 方法代替 promises 可以接受创建和返回 promises 的函数,所以它是相当通用的。这也可以解决依赖关系。
  • 表示感谢;我添加了一个将查询链接到我的答案的简单示例。
猜你喜欢
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 2011-11-28
  • 2018-03-23
  • 1970-01-01
相关资源
最近更新 更多