powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / multi insert and where select nodejs
9 сообщений из 34, страница 2 из 2
multi insert and where select nodejs
    #40016583
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
it_crb29
мой вопрос по сути сводился к следующему: я не могу сделать ни один insert пока не проверю что в pi есть достаточное количество quantity, т.е.
pi.quantuty >= $.quantity

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

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

В любом случае после парсинга данные уже на сервере, и можно проверять хоть скопом, хоть по одной записи - по вкусу.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40016649
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Да, именно так, спасибо за подробное разъяснение, еще раз, мое почтение вашему идеальному sql. Начну просмотр курса sql на юдеми, после просмотра вернусь к задаче.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40017798
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
it_crb29,

Прикладываю процедуру, которую сделал на данный момент, из проблем insert в таблицу sales проходит, но пропускается один индекс (скрин).
Так же подскажите как правильно обновить остатки на складах, что то вроде (stackoverflow)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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';



Процедура:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
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
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40017810
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
it_crb29,

Как вариант можно сделать триггер на insert в sales и делать update в price_information.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40017823
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
it_crb29
пропускается один индекс (скрин)

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

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

it_crb29
Код: sql
1.
2.
INSERT INTO checks(`data`, `user`) VALUES ( UNIX_TIMESTAMP(), 0);
SET last_index = (SELECT max(id) FROM checks);


А вот это вообще-то - безобразие... достаточно одного конкурентного процесса, чтобы получить кашу.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40017826
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Вот sales:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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) чуть позже я переделаю как следует и сообщу.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40017856
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А давайте Вы возьмёте мой fiddle, внесёте в него изменения (обновлённую структуру, данные, процедуру, приме её выполнения), и дадите ссылку. Ну чтобы прямо сразу смотреть и вносить изменения, причём в одно и то же...

А то скриншоты - оно, конечно, красиво, но ни разу не удобно.
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40017895
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

fiddle
...
Рейтинг: 0 / 0
multi insert and where select nodejs
    #40018264
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
it_crb29,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
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
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / multi insert and where select nodejs
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]