使用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){
那是一个也给我带来麻烦的领域,因为我最初的尝试是没有括号。