Javascript 如何正确使用Node.js MySQL中的重复密钥更新
我使用Node.js将值推送到MySQL表,如:Javascript 如何正确使用Node.js MySQL中的重复密钥更新,javascript,mysql,node.js,Javascript,Mysql,Node.js,我使用Node.js将值推送到MySQL表,如: for (var i = 0; i < data.length; i++) { flattenedData.push([data[i].id, data[i].adult, data[i].backdrop_path, JSON.stringify(data[i].genre_ids), data[i].original_language, data[i].original_title, data[i].overv
for (var i = 0; i < data.length; i++) {
flattenedData.push([data[i].id, data[i].adult, data[i].backdrop_path, JSON.stringify(data[i].genre_ids), data[i].original_language, data[i].original_title, data[i].overview, data[i].popularity, data[i].poster_path, data[i].release_date, data[i].title, data[i].video, data[i].vote_average, data[i].vote_count]);
//console.log(flattenedData);
}
db.query("INSERT INTO movies (id, adult, backdrop_path, genre_ids, original_language, original_title, overview, popularity, poster_path, release_date, title, video, vote_average, vote_count ) values ?", [flattenedData], function (err, result) {
if (err) {
throw err;
}
else {
console.log('data inserted' + result);
}
});
for(变量i=0;i
我想在重复键更新时将
添加到查询中,但我一直遇到语法错误,有人能告诉我正确的方法吗?我将把它缩短为三列,并假设id
是唯一的列
db.query("INSERT INTO movies (id, adult, backdrop_path) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE adult=VALUES(adult), backdrop_path=VALUES(backdrop_path)",
flattenedData, function (err, result) {
...
这意味着,如果insert导致主/唯一列(id
)上出现重复,则将其他列从尝试在values子句中插入的值复制到其各自的列中,覆盖其先前在现有行中的值
没有捷径可走;你必须把所有这样的专栏作业都拼出来
我很确定参数的query()
的参数应该是一个数组,但您的flattedData
似乎已经是一个数组了,因为您正在推它。所以我认为不需要把它放在方括号中。我将把它缩短为三列,并假设id
是唯一唯一的列
db.query("INSERT INTO movies (id, adult, backdrop_path) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE adult=VALUES(adult), backdrop_path=VALUES(backdrop_path)",
flattenedData, function (err, result) {
...
这意味着,如果insert导致主/唯一列(id
)上出现重复,则将其他列从尝试在values子句中插入的值复制到其各自的列中,覆盖其先前在现有行中的值
没有捷径可走;你必须把所有这样的专栏作业都拼出来
我很确定参数的query()
的参数应该是一个数组,但您的flattedData
似乎已经是一个数组了,因为您正在推它。所以我不认为你需要把它放在方括号里。我对如何在react/redux应用程序中实现这一点感到困惑,最终找到了“正确”的方法
我的实现要求我为一个包含21个字段的表中任意数量的记录更新每个记录的一个字段值
如果您将数据作为数组结构传递,请使用[['dataString',666.66],'dataString2',666666.66],'dataString3',666666]]之类的格式,然后确保将整个数据作为数组传递给查询函数。请参见下面我的代码示例中的itemQtyData
另一件让我绊倒的事情是在值替换字符串周围使用括号。我不需要它们。我看到的示例显示了需要它们的实现。我也只用了一个?对于所有的值。因此,我没有使用(?,)来表示查询中的值(这不起作用),而是使用了
我发现没有必要为表提供所有字段名和相应的值。如果字段没有默认值,MySQL将向您发出警告。我没有发现这是一个问题,在这种情况下
您可以在文件node\u modules/SqlString/lib/SqlString.js中的SqlString.format函数中控制台.log格式化的sql。我发现这很有用,可以确切地了解查询不起作用的原因,并且可以将一些东西插入MySQL工作台来处理
编辑:您也可以这样做console.log(connection.query(yourQuery,[someData],callback))当函数执行时,您会得到sql和更多信息。可能比向模块代码中添加console.log调用更有意义
希望这有帮助
let itemQtyData = order.map(item => {
return [
`${item.id}`,
`${Number(item.products_quantity - Number(item.quantity_to_add))}`
];
});
const updateQtyQuery =`INSERT INTO products (products_id, products_quantity) VALUES ? ON DUPLICATE KEY UPDATE products_quantity=VALUES(products_quantity)`;
connectionOSC.query(
updateQtyQuery,
[itemQtyData],
(error, results, fields) => {
if (error) throw error;
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: saleId,
response: results,
isBase64Encoded: false
};
context.succeed(response);
});
我对如何在react/redux应用程序中实现这一点感到困惑,最终找到了“正确”的方法
我的实现要求我为一个包含21个字段的表中任意数量的记录更新每个记录的一个字段值
如果您将数据作为数组结构传递,请使用[['dataString',666.66],'dataString2',666666.66],'dataString3',666666]]之类的格式,然后确保将整个数据作为数组传递给查询函数。请参见下面我的代码示例中的itemQtyData
另一件让我绊倒的事情是在值替换字符串周围使用括号。我不需要它们。我看到的示例显示了需要它们的实现。我也只用了一个?对于所有的值。因此,我没有使用(?,)来表示查询中的值(这不起作用),而是使用了
我发现没有必要为表提供所有字段名和相应的值。如果字段没有默认值,MySQL将向您发出警告。我没有发现这是一个问题,在这种情况下
您可以在文件node\u modules/SqlString/lib/SqlString.js中的SqlString.format函数中控制台.log格式化的sql。我发现这很有用,可以确切地了解查询不起作用的原因,并且可以将一些东西插入MySQL工作台来处理
编辑:您也可以这样做console.log(connection.query(yourQuery,[someData],callback))当函数执行时,您会得到sql和更多信息。可能比向模块代码中添加console.log调用更有意义
希望这有帮助
let itemQtyData = order.map(item => {
return [
`${item.id}`,
`${Number(item.products_quantity - Number(item.quantity_to_add))}`
];
});
const updateQtyQuery =`INSERT INTO products (products_id, products_quantity) VALUES ? ON DUPLICATE KEY UPDATE products_quantity=VALUES(products_quantity)`;
connectionOSC.query(
updateQtyQuery,
[itemQtyData],
(error, results, fields) => {
if (error) throw error;
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: saleId,
response: results,
isBase64Encoded: false
};
context.succeed(response);
});
可能重复@Eliasmar我正在使用JavaScript,您评论中的链接仅指SQL.Po