【发布时间】:2021-05-06 14:02:16
【问题描述】:
简单地说:我有一个表'a',一个表'b'和一个多对多表'a_b'。我需要在表'b'中插入一行,然后如果插入正确,则使用此行的id将其插入'a_b'以使其引用表'a'中的id。像这样的:
INSERT INTO b (foo) VALUE ('bar');
然后把得到的这个ID拿来做
INSERT INTO a_b (a_id, b_id) VALUES ('some_table_a_id', 'generated_b_table_id');
我在 NodeJS 服务器 Express API 上针对发布请求执行此操作,所以它看起来像这样:
app.post("/whatever", (req, res) => {
db.query(insert_into_b_sql, [params], (err, result, fields) => {
if (!err) {
db.query(insert_into_a_sql, [params], (err, result, fields) => {
if (!err) {
res.sendStatus(200);
} else {
throw err;
}
});
} else {
throw err;
}
});
});
我发现这有很多问题:
- 我没有插入行的最后一个 ID,而且我想我不能得到它。所以我需要在其中进行第三个 SQL 查询来获取 ID。这样做已经感觉不对了,所以我认为嵌套第三个 SQL 查询会更糟。
- 我进行了许多 SQL 查询,一旦投入生产,可能会导致成本增加。
- 如果第一个查询成功,但第二个没有,我需要更多查询来回滚,因为没有提交机制(我不知道)。
- 我认为我可以使用存储过程,但这里不可能,因为它需要在存储库中存储和维护,团队决定避免这种情况。
所以我们在这里:按照我描述的方式链接 SQL 查询是否合法?如果是,有什么方法可以防止我描述的回滚必要性?否则,考虑到应尽可能避免存储过程,还有哪些其他选择?
【问题讨论】:
标签: mysql node.js express node-mysql