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

我有一个表有一个复合主键(room_id,x_coord和y_coord)和另一个名为card_id的列。 我想插入几个logging到MySQL数据库。 我正在使用mysql库以及node.js的快速库。

如果logging不存在,我想插入由room_id,x_coord,y_coord和card_id组成的新logging。

另一方面,如果logging确实存在,我想将当前logging更新为新的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服务器版本的手册,在第一行的'?)'旁边使用正确的语法

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

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

编辑:该查询将只适用于单卡。 你可能想为每个卡片创build一个插入语句,这就要求你在循环内build立查询。 另外,它看起来像db_values将是一个数组数组,你将它传递给另一个数组的db_connection.query方法。 我想这种方法可能只需要一个单一的数组string。

要解决这个问题,你必须改变最后? 到要插入的列名称。

所以改变这一行:

 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){ 

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