|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
Добрый день уважаемые форумчане! Входные данные: Клиент передает на сервер json oбъект который содержит в себе массив вида (id, quantity, price) Моя функция для того чтоб сделать insert этого массива в db: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Вопрос в следующем, прежде чем сделать инсерт всех строк, нужно проверить не превышает ли количество в запросе, остаток в бд, если хотя бы одна строка не удовлетворяет условию, запрос не должен быть сделан. Я вижу три способа: 1. Доделать запрос до вида: Код: sql 1.
2. Создать еще одну функцию, в которую передать входящий массив и вернуть true/false (т.е. разделить запрос на две части) 3. Написать процедуру в самой БД которая и будет обрабатывать входящий массив и возвращать ответ. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 13:33 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
it_crb29 Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 13:35 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
Я за то, чтобы делать одним запросом. В противном случае возможны трудноуловимые глюки из-за конкурентных сессий. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 13:38 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
miksoft, что о вроде этого: Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 13:39 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
it_crb29, Да, что-то вроде этого. Только я бы еще предложил все вставляемые записи в один запрос поместить. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 13:44 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
miksoft, так они и так ведь упаковываются в один запрос, т.е. получается что то вроде: Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 13:52 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
it_crb29 так они и так ведь упаковываются в один запрос ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 13:55 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
miksoft, Буду думать как к каждому фрагменту insert приделать условие ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 13:56 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
it_crb29 miksoft, Буду думать как к каждому фрагменту insert приделать условие ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 14:05 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
miksoft, вот это пример с mysqltutorial: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Если бы это быа строка, тогда все ясно, но здесь массив. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 14:12 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
it_crb29, Если у вас уже есть массив записей (т.е. таблица), вам осталось преобразовать его в тип recordset* и обращаться с ним как с SQL таблицей, с которой вы уже знакомы. Я плохо знаком с MySQL, в Оракл это преобразование выглядело бы так: TABLE(todos). После этого работают SQL команды: "select * from TABLE(todos) where..." В вашем примере, в котором я понял вы хотите оформить заказ продаж на товары в наличии (верно?) В передаваемом массиве содержится один заказ на все товары, что желает покупатель. Когда товаров много, все понятно. Что должно случиться, когда товара не хватает по одной позиции? Наверное, один из трех: 1) весь заказ отменяется 2) заказ выполняется по другим позициям, отменяется часть по дефициту 3) заказ выполняется максимально, с уменьшенными количествами по дефициту ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 20:32 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
НеофитSQL, да, все верно. В моем случае, заказ не должен быть выполнен, запрос не должен быть выполнен. Я полагаю, учитывая, к сожалению, мой скромные познания в sql, что дополнить надлежащим образом нижеследующий запрос невозможно и для решения проблемы нужно или 1 . Писать еще одну функцию, которая сравнит передаваемое количество с остатком для каждого поля заказа и вернет промис. 2 . Сделать все это в процедуре. Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 20:48 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
it_crb29, используя синтакс TABLE(todos), я бы написал что-то такое: Код: sql 1. 2. 3. 4. 5. 6. 7.
Вы умеете читать/писать SQL джойны? Они тут нужны, чтобы связать запрос с таблицей товаров, где находится их количество. "group" я добавил на тот случай, если в JSON объекте есть повторения товаров, например клиент-филолог заказал четыре кочерги, а потом еще две в отдельной строчке. Это простая часть - проверка на достаточное наличие товара. Учтите, что в многопользовательском режиме два заказа могут появиться одновременно, и каждый выполним, но на оба заказа товара не хватит. Если сначала проверить на присутствие товара, а потом вычитать из инвентаря, можно уйти в минус. Чтобы такого не случилось, нужно или применить логику резерваций (одновременно с проверкой на наличие вычитается товар из инвентаря), или применить строгую очередность заказов, где следующий заказ не может появиться пока не закончился предыдущий. Для максимальной скорости исполнения заказов, первый подход лучше. Я предпочитаю второй подход для моих неторопливых задач, т.к. первый сложнее в исполнении, и требует бОльшего опыта для безошибочной реализации, чем сейчас у меня есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 21:24 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
НеофитSQL, LEFT JOIN умею, завтра займусь, спасибо за ответы. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 21:59 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
НеофитSQL Если у вас уже есть массив записей (т.е. таблица), вам осталось преобразовать его в тип recordset* и обращаться с ним как с SQL таблицей, с которой вы уже знакомы. Я плохо знаком с MySQL, в Оракл это преобразование выглядело бы так: TABLE(todos). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2020, 12:55 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
miksoft, Не придумал ничего умнее чем в цикле создать запрос вида Код: sql 1. 2. 3.
вернуть промис и на основе ответа делать/не делать запрос insert. П.С. Выглядит убого. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 14:12 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
it_crb29, П.С, пошел смотреть продвинутый курс по mysql, бех этих знаний не обойтись. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 14:35 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
it_crb29 , что-то Вы явно не то делаете. Теоретически нужно просто передать объект на MySQL как есть, а там его распарсить и разложить по клеточкам. it_crb29 Входные данные: Клиент передает на сервер json oбъект который содержит в себе массив вида (id, quantity, price) it_crb29 сделать insert этого массива в db Выложите: 1. Пример JSON-объекта в том виде, в каком он поступает от клиента (3-4 записи достаточно). 2. CREATE TABLE таблицы-приёмника, в которую нужно поместить эти данные, и, если в зависимости от данных в JSON могут потребоваться как INSERT, так и UPDATE, дополнительно INSERT INTO 2-3 уже имеющихся записей. 3. Итоговый результат, который требуется получить (таблицей). 4. Точную версию MySQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 15:36 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
Akina, 1. C клиента приходит: Код: javascript 1. 2. 3. 4.
2. sales : таблица в которую просто идет запись(тот самый мульти инсерт, c этой таблицей ничего сравнивать не нужно, в неё только запись) table sales Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
3. prais_information AS pi : таблица в которой лежат остатки Соответственно pi.code === id and pi.stock >= quantity Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
pi 4. mysql: mysql Ver 8.0.22 for Linux on x86_64 (MySQL Community Server - GPL) 5. В итоге записи в sales делаются только тогда когда товара достаточно т.е. pi.stock >= quantity , если хотя бы одного товара не достаточно, ничего не записывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 16:00 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
С точки зрения MySQL такой JSON - невалидный. Надеюсь, преобразовать ЭТО в формат Код: sql 1. 2. 3. 4.
не составит проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 16:16 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
Akina, Код: javascript 1. 2. 3. 4.
Эти данные у меня приходят на сервер nodejs. C nodejs я преобразую и отправлю на сервер mysql так, как это необходимо. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 16:22 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
В таблице sales имеются поля code и idCheck , которые NOT NULL и не имеют DEFAULT. В JSON их нет. Откуда берутся их значения? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 16:25 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
Akina, id === code, idCheck - на данный момент это пока константа(любое число) Для удобства, входящие данные можем заменить на: Код: javascript 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 16:29 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
В общем, любуйтесь и разбирайтесь: fiddle . ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 16:34 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
Akina, Ваши sql запросы, как всегда, неотразимы, передавать на mysql server json массив и там его парсить, я даже не знал, что так можно... Спасибо за пример, я обязательно разберу и буду передавать из nodejs в mysql json, а не готовый мульти запрос. Однако мой вопрос по сути сводился к следующему: я не могу сделать ни один insert пока не проверю что в pi есть достаточное количество quantity, т.е. pi.quantuty >= $.quantity Проще говоря, если на складе чего то не хватает, то заказ не принимается. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 16:44 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
it_crb29 мой вопрос по сути сводился к следующему: я не могу сделать ни один insert пока не проверю что в pi есть достаточное количество quantity, т.е. pi.quantuty >= $.quantity Проще говоря, если на складе чего то не хватает, то заказ не принимается. Ну так парсим во временную таблицу, запросом проверяем наличие. Если есть - копируем данные из временной таблицы в рабочую, если нет - просто дропаем временную таблицу и выдаём отказ. В любом случае после парсинга данные уже на сервере, и можно проверять хоть скопом, хоть по одной записи - по вкусу. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 16:55 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
Akina, Да, именно так, спасибо за подробное разъяснение, еще раз, мое почтение вашему идеальному sql. Начну просмотр курса sql на юдеми, после просмотра вернусь к задаче. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2020, 21:44 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
it_crb29, Прикладываю процедуру, которую сделал на данный момент, из проблем insert в таблицу sales проходит, но пропускается один индекс (скрин). Так же подскажите как правильно обновить остатки на складах, что то вроде (stackoverflow) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Процедура: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 09:25 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
it_crb29, Как вариант можно сделать триггер на insert в sales и делать update в price_information. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 09:51 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
it_crb29 пропускается один индекс (скрин) Это - таблица sales ? ну так, чисто по набору полей... тогда актуализируйте структуру - у Вас выше в коде id вот ни разу не автоинкремент, а значения туда чем-то надуло... А если автоинкремент - то Вас вообще его значение не должно волновать. it_crb29 Код: sql 1. 2.
А вот это вообще-то - безобразие... достаточно одного конкурентного процесса, чтобы получить кашу. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 10:29 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
Akina, Вот sales: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Если все дропнуть и создать занова, выполнить два раза процедуру test, я получаю в sales следующее: screen C max(id) чуть позже я переделаю как следует и сообщу. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 10:41 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
А давайте Вы возьмёте мой fiddle, внесёте в него изменения (обновлённую структуру, данные, процедуру, приме её выполнения), и дадите ссылку. Ну чтобы прямо сразу смотреть и вносить изменения, причём в одно и то же... А то скриншоты - оно, конечно, красиво, но ни разу не удобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 11:45 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 13:35 |
|
multi insert and where select nodejs
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 11:51 |
|
|
start [/forum/topic.php?all=1&fid=47&tid=1828312]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
138ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 273ms |
total: | 515ms |
0 / 0 |