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 09.11.2020 21:42

Буду использовать временную таблицу.

Вам спасибо за подробное разъяснение. Начну просмотр курса sql на юдеми, после просмотра вернусь к задаче.

laimas 09.11.2020 22:30

Цитата:

Сообщение от andrew76
Буду использовать временную таблицу

Если ваше условие, что я проглядел, это нет вставки если хотя бы один товар из вставляемых не отвечает условию, то смысла во временной таблице нет, проще сделать запрос

'SELET 1 WHERE NOT EXISTS (SELECT * FROM pi WHERE code IN(sales.code, sales.code, ....) AND stock BETWEEN sales.quantity.min AND sales.quantity.max)'


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

andrew76 10.11.2020 08:20

Элегантное решение моих union select, сделать такой select и при правильном исходе в .then делать insert. Решение неплохое, но оно КМК не "энтерпрайз". В любом случае спасибо за помощь, я отпишусь в конце недели, как просмотрю и усвою курс. Спасибо.

laimas 10.11.2020 08:29

Цитата:

Сообщение от andrew76
Элегантное решение моих union select

Когда UNION считался элегантным решением? И зачем вообще оно нужно? Вы же хотите узнать есть ли недопустимые значения, а это как показано, для всех входящих sales.code и их диапазона значений, то есть нет ли значения stock в диапазоне мин/мах sales.quantity. Зачем же плодить юнионы, которые в данном случае как собаке пятая лапа?

andrew76 10.11.2020 11:08

Боюсь вы неверно поняли, я хотел сказать, что наговнокодил с UNION, вы же написали элегантное решение. Недопонимание вышло.

SuperZen 10.11.2020 11:13

напиши хранимую процедуру )) https://www.mysqltutorial.org/mysql-if-statement/

andrew76 10.11.2020 11:40

Как сделаю, выложу.

laimas 10.11.2020 18:20

Цитата:

Сообщение от andrew76
Боюсь вы неверно поняли

Видимо так, но если вы будете проверять запросом что я показывал, то из мин/макс значений вставляемых надо вычитать 1, так как BETWEEN не вернет "можно вставлять", если любое из значений будет равно stock, а у вас это разрешено.

andrew76 13.11.2020 09:42

Прикладываю процедуру, которую сделал на данный момент, из проблем insert в таблицу sales проходит, но пропускается один индекс (скрин).
Так же подскажите как правильно обновить остатки на складах, что то вроде(stackoverflow)
You can use a CASE statement to handle multiple if/then scenarios:

UPDATE table_to_update 
SET  cod_user= CASE WHEN user_rol = 'student' THEN '622057'
                   WHEN user_rol = 'assistant' THEN '2913659'
                   WHEN user_rol = 'admin' THEN '6160230'
               END
    ,date = '12082014'
WHERE user_rol IN ('student','assistant','admin')
  AND cod_office = '17389551';



Процедура:

BEGIN

DECLARE res INT;
DECLARE last_index INT;
SET @input := 'sales:  [  { id: 2, quantity: 5, price: 123, sum: 615 },  { id: 1, quantity: 9, price: 97, sum: 873 } ]';

SET @input:=REPLACE(@input, ' ', '');
SET @input:=REPLACE(@input, 'sales:', '');
SET @input:=REGEXP_REPLACE(@input, '([{,])([a-z])', '$1"$2');
SET @input:=REGEXP_REPLACE(@input, '([a-z]):', '$1":');

CREATE TEMPORARY TABLE new_tbl SELECT jtin.id AS jtin_id, jtin.quantity AS jtin_qty, pi.stock AS pi_qty, pi.price AS pi_price
FROM JSON_TABLE(@input,
                "$[*]"
                COLUMNS (id INT PATH "$.id" ,
                         quantity MEDIUMINT PATH "$.quantity",
                         price DECIMAL(7,2) PATH "$.price",
                         `sum` DECIMAL(8,2) PATH "$.sum"
                         )) AS jtin 
                LEFT JOIN prais_informations AS pi ON jtin.id  = pi.code;

SET res = (SELECT count(*) FROM new_tbl WHERE jtin_qty > pi_qty);

IF res = 0 THEN 
/*
  Инсертим новую запись, получившийся id, будет являтся id чека
*/
INSERT INTO checks(`data`, `user`) VALUES ( UNIX_TIMESTAMP(), 0);
SET last_index = (SELECT max(id) FROM checks);
/*
  Инсертим содержимое массива заказа в таблицу регистрации
*/
INSERT INTO sales(`code`, `quantity`, `price`, `sum`, `idCheck`) SELECT nt.jtin_id, nt.jtin_qty, nt.pi_price, (nt.jtin_qty * nt.pi_price), last_index FROM new_tbl AS nt;

/*
  Обновляем остатки на складе
*/

END IF

END

andrew76 13.11.2020 09:49

Как вариант можно сделать триггер на insert в sales и делать update в price_information.


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