mysql multi insert
Добрый день уважаемые форумчане!
Входные данные: Клиент передает на сервер json oбъект который содержит в себе массив вида (id, quantity, price) Моя функция для того чтоб сделать insert этого массива в db: static addSale(products){ //WHERE (SELECT stock FROM prais_informations WHERE code = ) > 20; let quer = 'INSERT INTO `sales` (`id`, `code`, `quantity`, `price`, `sum`, `idCheck`) VALUES ?;'; return new Promise((resolve, reject) => { pool.getConnection((err, connection) => { if (err)reject(err); connection.query(quer, [products.map(item => [null, item.id, item.quantity, item.price, item.sum, 3])], (err, rows) => { if (err) { reject(err); } resolve(rows); connection.release(); }); }); }); } Вопрос в следующем, прежде чем сделать инсерт всех строк, нужно проверить не превышает ли количество в запросе, остаток в бд, если хотя бы одна строка не удовлетворяет условию, запрос не должен быть сделан. Вариант я вижу один, создать дополнительную функцию, которая вернет в промисе AND нескольких селектов (true/false) и в части then уже делать insert запрос. |
Цитата:
|
Цитата:
|
Цитата:
|
andrew76,
что с чем сравнивать не знаю, но зачастую отдельного запрос не требуется. Пример простой, если я правильно понял, то нужно типа такого: "INSERT INTO table (count) SELECT N WHERE (SELECT balance FROM table LIMIT 1) > N" где N - это вставляемое количество в поле count, balance - это поле остатка в этой же таблице. Тут используется просто поле со значением по умолчанию, для всех, поэтому и LIMIT 1. Если вставка для конкретного ID, то нужно взять для этого ID, но сама вставка при этом, это уже будет обновление. То есть остаток по идее, это уже другая таблица, откуда он и извлекается для ID. Иначе это только ON DUPLICATE KEY UPDATE. |
Цитата:
|
Цитата:
https://www.mysqltutorial.org/mysql-nodejs/insert/ |
Цитата:
https://ibb.co/NntTBDr https://ibb.co/tm4z09n В функции, которую я представил выше, формируется запрос вида: INSERT INTO `sales` (`id`, `code`, `quantity`, `price`, `sum`, `idCheck`) VALUES (null, item.id, item.quantity, item.price, item.sum, 3), (null, item.id, item.quantity, item.price, item.sum, 3) , ... , (null, item.id, item.quantity, item.price, item.sum, 3); Но прежде чем сделать инсерты в `sales` нужно проверить, не превышает ли доступный остаток каждый элемент из VALUES. 1. Мне кажется одним запросом это не сделать, нужно написать новую функцию, которая примет массив, сравнит quantity c balance и вернет промис. Задача довольно типовая, поэтому я и задаюсь вопросом, как это реализовать правильно. |
Цитата:
Другое дело PDO, в нем есть и именованные псевдопеременные. Не проблема разместить в теле запроса в любом месте :a, :b ... и передать для записи массив [a=> 12, b=> 15] (объект, в случае Node) и проблем не будет никогда. Есть ли в Node поддержка абстракций для работы с БД не в курсе. А вообще такие запросы выгодно выполнять в случаях например множественной вставки или обновлений. В этом случае запрос подготавливается, проверяется, а затем в него вместо псевдопеременных просто подставляются новые данные. |
Цитата:
Можно предполагать, например, это заказ/продажа пишется в таблицу А, то есть информация о неком продукте. Сами продукты описаны в таблице В. Тогда в одном запросе можно обратиться к таблице В, сравнив его остаток со вставляемым значением в таблицу А. Делается это так как я показывал. Ваше же пояснение ни о чем не говорит, что с чем, откуда это все, не понять. |
Часовой пояс GMT +3, время: 06:11. |