【问题标题】:Proper way to execute sequence of mysql queries with javascipt mysql client使用 javascript mysql 客户端执行 mysql 查询序列的正确方法
【发布时间】: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;
    }
  });
});

我发现这有很多问题:

  1. 我没有插入行的最后一个 ID,而且我想我不能得到它。所以我需要在其中进行第三个 SQL 查询来获取 ID。这样做已经感觉不对了,所以我认为嵌套第三个 SQL 查询会更糟。
  2. 我进行了许多 SQL 查询,一旦投入生产,可能会导致成本增加。
  3. 如果第一个查询成功,但第二个没有,我需要更多查询来回滚,因为没有提交机制(我不知道)。
  4. 我认为我可以使用存储过程,但这里不可能,因为它需要在存​​储库中存储和维护,团队决定避免这种情况。

所以我们在这里:按照我描述的方式链接 SQL 查询是否合法?如果是,有什么方法可以防止我描述的回滚必要性?否则,考虑到应尽可能避免存储过程,还有哪些其他选择?

【问题讨论】:

    标签: mysql node.js express node-mysql


    【解决方案1】:

    我想你正在使用 nodejs mysql 库,因为它在标题中被标记。对于其他库,您可以保留这个概念。

    1. 我没有插入行的最后一个 ID,而且我想我无法得到它。

    query() 方法应该返回最后插入的记录。您可以在回调中检查resultfields。文档中也注明:https://www.npmjs.com/package/mysql#getting-the-id-of-an-inserted-row

    1. 我进行了许多 SQL 查询,一旦投入生产,可能会导致成本增加。

    是的,但根据要求,我们必须有 2 个单独的查询。

    1. 如果第一个查询成功,但第二个没有,我需要更多查询来回滚,因为没有提交机制(我不知道)。

    您需要使用事务。一旦事务中的一个命令失败,你可以回滚整个。查看文档here

    【讨论】:

    • 非常感谢,回答了所有问题!交易是我案例的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2015-09-24
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多