Я использую 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
, но я продолжаю получать синтаксические ошибки, может ли кто-нибудь показать мне правильный путь?
Я собираюсь сократить это до трех столбцов и считать 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
уже является массивом, поскольку вы нажимаете на него. Поэтому я не думаю, что вам нужно положить его в квадратные скобки.
Я был смущен тем, как заставить это работать в приложении 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);
});