Как правильно использовать ON DUPLICATE KEY UPDATE в Node.js MySQL

0

Я использую 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);
        }
     });

Я хочу добавить в запрос ON DUPLICATE KEY UPDATE, но я продолжаю получать синтаксические ошибки, может ли кто-нибудь показать мне правильный путь?

2 ответа

0
Лучший ответ

Я собираюсь сократить это до трех столбцов и считать 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) {
...

Это означает, что если вставка приводит к дублированию в основном/уникальном столбце (id), затем скопируйте другие столбцы из значений, которые вы пытались вставить в предложение VALUES, в их соответствующий столбец, переопределяя то, что их значение было ранее в существующей строке,

Там нет ярлыка для этого; вы должны указать все такие назначения столбцов.

Я почти уверен, что аргумент query() для параметров должен быть массивом, но похоже, что ваш flattenedData уже является массивом, поскольку вы нажимаете на него. Поэтому я не думаю, что вам нужно положить его в квадратные скобки.

-1

Я был смущен тем, как заставить это работать в приложении response/redux и в конечном итоге пришел к "правильному" методу.

Для моей реализации мне потребовалось обновить одно значение поля для каждой записи для произвольного количества записей в таблице с 21 полем.

Если вы передаете данные в виде структуры массива, то, например, [['dataString', 666.66], ['dataString2', 666666.66], ['dataString3', 666666666.66]], а затем убедитесь, что вы передали все это как массив в функция запроса. См. ItemQtyData в моем примере кода ниже.

Еще одна вещь, которая сбила меня с толку, заключалась в использовании скобок вокруг строки замены значений. Мне они не нужны. В примерах, которые я смотрел, были показаны реализации, которые им нужны. Я также использовал только сингл? для всех значений. Поэтому вместо того, чтобы использовать (?,?) Для представления значений в запросе, который не работал, я использовал?.

Мне не нужно было указывать все имена полей и соответствующие значения для таблицы. MySQL предупредит вас, если поля не имеют значения по умолчанию. В этом случае я не считаю, что это проблема.

Вы можете console.log отформатированный sql в функции SqlString.format в файле node_modules/sqlstring/lib/SqlString.js. Мне показалось, что это полезно, чтобы понять, почему запрос не работал, и иметь что-то, что я мог бы подключить к MySQL Workbench.

Изменение: вы также можете выполнить этот 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);
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню