Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确使用Node.js MySQL中的重复密钥更新_Javascript_Mysql_Node.js - Fatal编程技术网

Javascript 如何正确使用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

我使用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].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