|
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 |
|
|
start [/forum/topic.php?fid=47&msg=40016198&tid=1828312]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
126ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 239ms |
0 / 0 |