Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: multi insert and where select nodejs  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20785
it_crb29
мой вопрос по сути сводился к следующему: я не могу сделать ни один insert пока не проверю что в pi есть достаточное количество quantity, т.е.
pi.quantuty >= $.quantity

Проще говоря, если на складе чего то не хватает, то заказ не принимается.

Ну так парсим во временную таблицу, запросом проверяем наличие. Если есть - копируем данные из временной таблицы в рабочую, если нет - просто дропаем временную таблицу и выдаём отказ.

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

Сообщение было отредактировано: 9 ноя 20, 16:52
9 ноя 20, 16:55    [22228891]     Ответить | Цитировать Сообщить модератору
 Re: multi insert and where select nodejs  [new]
it_crb29
Member

Откуда: г. Котлас
Сообщений: 27
Akina,

Да, именно так, спасибо за подробное разъяснение, еще раз, мое почтение вашему идеальному sql. Начну просмотр курса sql на юдеми, после просмотра вернусь к задаче.
9 ноя 20, 21:44    [22229122]     Ответить | Цитировать Сообщить модератору
 Re: multi insert and where select nodejs  [new]
it_crb29
Member

Откуда: г. Котлас
Сообщений: 27
it_crb29,

Прикладываю процедуру, которую сделал на данный момент, из проблем 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


К сообщению приложен файл. Размер - 135Kb
13 ноя 20, 09:25    [22231233]     Ответить | Цитировать Сообщить модератору
 Re: multi insert and where select nodejs  [new]
it_crb29
Member

Откуда: г. Котлас
Сообщений: 27
it_crb29,

Как вариант можно сделать триггер на insert в sales и делать update в price_information.
13 ноя 20, 09:51    [22231248]     Ответить | Цитировать Сообщить модератору
 Re: multi insert and where select nodejs  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20785
it_crb29
пропускается один индекс (скрин)

Это - таблица sales? ну так, чисто по набору полей... тогда актуализируйте структуру - у Вас выше в коде id вот ни разу не автоинкремент, а значения туда чем-то надуло...

А если автоинкремент - то Вас вообще его значение не должно волновать.

it_crb29
INSERT INTO checks(`data`, `user`) VALUES ( UNIX_TIMESTAMP(), 0);
SET last_index = (SELECT max(id) FROM checks);

А вот это вообще-то - безобразие... достаточно одного конкурентного процесса, чтобы получить кашу.
13 ноя 20, 10:29    [22231267]     Ответить | Цитировать Сообщить модератору
 Re: multi insert and where select nodejs  [new]
it_crb29
Member

Откуда: г. Котлас
Сообщений: 27
Akina,
Вот sales:
CREATE TABLE `sales` (
  `id` int UNSIGNED NOT NULL,
  `code` int UNSIGNED NOT NULL,
  `quantity` mediumint UNSIGNED NOT NULL,
  `price` decimal(7,2) NOT NULL,
  `sum` decimal(8,2) NOT NULL,
  `idCheck` int UNSIGNED NOT NULL,
  `data` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


--
ALTER TABLE `sales`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idCheck` (`idCheck`);

--
ALTER TABLE `sales`
  MODIFY `id` int UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;


Если все дропнуть и создать занова, выполнить два раза процедуру test, я получаю в sales следующее:

screen

C max(id) чуть позже я переделаю как следует и сообщу.
13 ноя 20, 10:41    [22231272]     Ответить | Цитировать Сообщить модератору
 Re: multi insert and where select nodejs  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20785
А давайте Вы возьмёте мой fiddle, внесёте в него изменения (обновлённую структуру, данные, процедуру, приме её выполнения), и дадите ссылку. Ну чтобы прямо сразу смотреть и вносить изменения, причём в одно и то же...

А то скриншоты - оно, конечно, красиво, но ни разу не удобно.

Сообщение было отредактировано: 13 ноя 20, 11:40
13 ноя 20, 11:45    [22231324]     Ответить | Цитировать Сообщить модератору
 Re: multi insert and where select nodejs  [new]
it_crb29
Member

Откуда: г. Котлас
Сообщений: 27
Akina,

fiddle
13 ноя 20, 13:35    [22231381]     Ответить | Цитировать Сообщить модератору
 Re: multi insert and where select nodejs  [new]
it_crb29
Member

Откуда: г. Котлас
Сообщений: 27
it_crb29,

На текущий момент так, можно добавить LOCK на таблицу, у меня не выходит, по поводу пропуска значений в auto_increment, mysql гарантирует уникальность поля, но не последовательность, для послдовательности, нужно выставить innodb_autoinc_lock_mode = 0

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 

INSERT INTO checks(`data`, `user`) VALUES ( UNIX_TIMESTAMP(), 0);

SET last_index = LAST_INSERT_ID();
/*
  Инсертим содержимое массива заказа в таблицу регистрации
*/
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;

UPDATE prais_informations AS pi LEFT JOIN new_tbl ON pi.code = new_tbl.jtin_id SET pi.stock = pi.stock - new_tbl.jtin_qty;

END IF;

END
14 ноя 20, 11:51    [22231967]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / MySQL Ответить