使用Node.js将多个值插入或更新到MySQL表中

时间:2017-10-12 23:27:35

标签: javascript mysql node.js upsert

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

如果记录不存在,我想插入一个由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服务器版本,以获得正确的语法   使用附近&#39;?)&#39;在第1行

我在这里做错了什么,我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:0)

首先,我相信准备好的语句中的问号数量应该与参数列表的长度匹配(db_values Array)。 其次,您不希望在update子句中的值附近使用括号。参考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=?

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

答案 1 :(得分:0)

要解决此问题,您必须将最后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){

awk 'NR==5' youfilewithcookie | awk {'print $7'} | (read sessId; yourculcommand here with $sessId)

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