Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   mysql multi insert (https://javascript.ru/forum/node-js-io-js/81307-mysql-multi-insert.html)

andrew76 07.11.2020 21:54

Цитата:

Сообщение от laimas (Сообщение 530468)
Вдумайтесь в то, что вы написали, и это в контексте вставки в базу. Если "INSERT INTO `sales` (`id`" и при этом его значение указывается null, значит это новая запись, для поля id с автоинкрементом. Так? А если так, у кого нужно проверить значение, если записи как таковой в базе еще не существует?

Можно предполагать, например, это заказ/продажа пишется в таблицу А, то есть информация о неком продукте. Сами продукты описаны в таблице В. Тогда в одном запросе можно обратиться к таблице В, сравнив его остаток со вставляемым значением в таблицу А. Делается это так как я показывал.

Ваше же пояснение ни о чем не говорит, что с чем, откуда это все, не понять.

Хорошо, завтра я над этим поработаю.

andrew76 09.11.2020 14:09

Не придумал ничего умнее чем в цикле создать запрос вида
SELECT true WHERE (SELECT prais_informations.stock FROM prais_informations WHERE prais_informations.code = 1 LIMIT 1) > 7 
UNION
 SELECT true WHERE (SELECT prais_informations.stock FROM prais_informations WHERE prais_informations.code = 2 LIMIT 1) > 3

вернуть промис и на основе ответа делать/не делать запрос insert.

SuperZen 09.11.2020 14:12

надо было триггер beforeInsert написать... и использовать транзацию)

andrew76 09.11.2020 14:18

Цитата:

Сообщение от SuperZen (Сообщение 530541)
надо было триггер beforeInsert написать... и использовать транзацию)

Пожалуйста опишите подробнее вашу рекомендацию, триггер это уже на стороне мускула, как я понимаю.

П.С, сейчас попробую сделать процедуру.
П.С, пошел смотреть продвинутый курс по mysql, бех этих знаний не обойтись.

SuperZen 09.11.2020 14:31

надо писать много букаф ).. по вашему получается: можно купить только половину, а можно и все, а можно и ничего, а если будет несколько пользователей, претендующих на одно и тоже... потом тень на плетень, сиди и думай ) кому и что показывать на какие запросы...

laimas 09.11.2020 14:57

'INSERT INTO `sales` (`id`, `code`, `quantity`, `price`, `sum`, `idCheck`)

и при это для id указывать null не обязательно, проще убрать id из запроса. А проверить надо с параметрами таблицы prais_informations? Что с чем?

andrew76 09.11.2020 15:07

SELECT prais_informations.stock <=  количество для товара 0*  FROM prais_informations WHERE prais_informations.code = код товара 0*
...
SELECT prais_informations.stock <= количество для товара n* FROM prais_informations WHERE prais_informations.code = код товара n*

* - приходит в запросе от клиентской части.

где n количество товаров в текущем заказе, товары не дублируются, если хотя бы один из этих запросов возвращает false заказ дальше не идет, запись в БД не происходит.

laimas 09.11.2020 15:12

Что с чем сравнивать? Это не сравнение, это получение параметров из другой таблицы. С какими полями таблицы `sales` нужно сравнивать эти параметры?

andrew76 09.11.2020 15:17

sales: таблица в которую просто идет запись(тот самый мульти инсерт, c этой таблицей ничего сравнивать не нужно, в неё только запись)

sales

prais_information AS pi: таблица в которой лежат остатки, от клиента приходит массив вида [id, quantity, price, sum]

Соответственно pi.code === id and pi.stock >= quantity

pi

laimas 09.11.2020 16:34

Да, не получится при многострочной вставке проверить, так как нельзя выбрать группы записей у несуществующего и сослаться не на что. Без временной таблицы не обойтись. Только в цикле:

var data = [
    [code, quantity, ....],
    [code, quantity, ....],
    ....
];

data.forEach((d)=> {
    query('INSERT INTO sales (code, quantity, ...) SELECT ' + d.join(',') + ' WHERE (SELECT stock FROM pi WHERE code=' + d.code + ') >=' + d.quantity)
})


Часовой пояс GMT +3, время: 15:43.