【问题标题】:Inserting or Updating multiple values into a MySQL table using Node.js使用 Node.js 将多个值插入或更新到 MySQL 表中
【发布时间】:2018-03-25 00:36:23
【问题描述】:

我有一个表,它有一个复合主键(room_id、x_coord 和 y_coord)和另一个名为 card_id 的列。我正在尝试将几条记录插入到 mysql 数据库中。我正在使用 mysql 库以及 node.js 的 express 库。

如果记录不存在,我想插入一条由 room_id、x_coord、y_coord 和 card_id 组成的新记录。

另一方面,如果记录确实存在,我想将当前记录更新为新的card_id。

这是我当前代码的副本:

//previously defined: room_id, x, y, and cards[]

var i = 0;
var db_values = [];
for (var row = 0; row < y; row++){
    for (var col = 0; col < x; col++){
        card = cards[i];
        //The following line may have a problem?
        db_values.push([room_id, col, row, card['id'], card['id']]);

        i++;
    }
}


sql = "insert into user_card(room_id, x_coord, y_coord, card_id) values ? on duplicate key update card_id = values(?)";
//The following line may have a problem?
db_connection.query(sql, [db_values], function (err, result){
    if (err){
        console.log("Upsert  DB ERROR: " + err);
        return;
    }

});

我尝试了各种代码组合,每种组合都会产生不同的错误。上面的一个产生以下错误:

ER_PARSE_ERROR:您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以获得正确的语法 在第 1 行使用 '?)' 附近

我在这里做错了什么,我可以做些什么来解决这个问题?

【问题讨论】:

    标签: javascript mysql node.js upsert


    【解决方案1】:

    首先,我相信您准备好的语句中的问号数量应该与您的参数列表(db_values 数组)的长度相匹配。 其次,您不希望在更新子句中的值周围加上括号。参考https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

    也许这样的陈述更有效:

    insert into user_card(room_id, x_coord, y_coord, card_id)
    values (?, ?, ?, ?)
    on duplicate key update card_id=?
    

    编辑: 该查询仅适用于单张卡。您可能希望为每张卡片创建一个插入语句,这要求您在循环内构建查询。此外,看起来db_values 将是一个数组数组,您将它传递给带有另一个数组的 db_connection.query 方法。我想该方法可能只需要一个字符串数组。

    【讨论】:

    • 与修改后的查询一起,db_values 不应作为数组传递。按原样传递 db_values..
    • @srivelayutharaja 和吉姆。感谢您尝试提供帮助。但是,我已经解决了答案。请查看我发布的答案。
    【解决方案2】:

    要解决此问题,您必须将最后一个 ? 更改为您要插入的列名。

    所以改变这一行:

    sql = "insert into user_card(room_id, x_coord, y_coord, card_id)
            values ? on duplicate key update card_id = values(?)";
    

    到这一行:

    sql = "insert into user_card(room_id, x_coord, y_coord, card_id)
            values ? on duplicate key update card_id = values(card_id)";
    

    确保在以下行中的查询中用方括号将[db_values] 括起来也很重要:

    db_connection.query(sql, [db_values], function (err, result){
    

    这也是给我带来麻烦的一个领域,因为我最初是在没有括号的情况下尝试的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 2015-04-25
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多