对多个查询的批处理INSERT引发外键冲突

时间:2018-08-09 21:59:40

标签: postgresql pg-promise

我正在跟踪this进行批量插入 有两个查询。第一个查询插入<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"

以上查询是否没有按顺序执行?首先插入表一,然后插入表二?

这与提交查询的方式有关吗?我还尝试使用上面链接页面中的示例所示的交易。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

  

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

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

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

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