![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
07.11.2020, 21:54
|
Интересующийся
|
|
Регистрация: 07.11.2020
Сообщений: 16
|
|
Сообщение от laimas
|
Вдумайтесь в то, что вы написали, и это в контексте вставки в базу. Если "INSERT INTO `sales` (`id`" и при этом его значение указывается null, значит это новая запись, для поля id с автоинкрементом. Так? А если так, у кого нужно проверить значение, если записи как таковой в базе еще не существует?
Можно предполагать, например, это заказ/продажа пишется в таблицу А, то есть информация о неком продукте. Сами продукты описаны в таблице В. Тогда в одном запросе можно обратиться к таблице В, сравнив его остаток со вставляемым значением в таблицу А. Делается это так как я показывал.
Ваше же пояснение ни о чем не говорит, что с чем, откуда это все, не понять.
|
Хорошо, завтра я над этим поработаю.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
09.11.2020, 14:09
|
Интересующийся
|
|
Регистрация: 07.11.2020
Сообщений: 16
|
|
Не придумал ничего умнее чем в цикле создать запрос вида
SELECT true WHERE (SELECT prais_informations.stock FROM prais_informations WHERE prais_informations.code = 1 LIMIT 1) > 7
UNION
SELECT true WHERE (SELECT prais_informations.stock FROM prais_informations WHERE prais_informations.code = 2 LIMIT 1) > 3
вернуть промис и на основе ответа делать/не делать запрос insert.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
09.11.2020, 14:12
|
![Аватар для SuperZen](https://javascript.ru/forum/image.php?u=61392&dateline=1542967156) |
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 641
|
|
надо было триггер beforeInsert написать... и использовать транзацию)
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
09.11.2020, 14:18
|
Интересующийся
|
|
Регистрация: 07.11.2020
Сообщений: 16
|
|
Сообщение от SuperZen
|
надо было триггер beforeInsert написать... и использовать транзацию)
|
Пожалуйста опишите подробнее вашу рекомендацию, триггер это уже на стороне мускула, как я понимаю.
П.С, сейчас попробую сделать процедуру.
П.С, пошел смотреть продвинутый курс по mysql, бех этих знаний не обойтись.
Последний раз редактировалось andrew76, 09.11.2020 в 14:33.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
09.11.2020, 14:31
|
![Аватар для SuperZen](https://javascript.ru/forum/image.php?u=61392&dateline=1542967156) |
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 641
|
|
надо писать много букаф ).. по вашему получается: можно купить только половину, а можно и все, а можно и ничего, а если будет несколько пользователей, претендующих на одно и тоже... потом тень на плетень, сиди и думай ) кому и что показывать на какие запросы...
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
09.11.2020, 14:57
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
'INSERT INTO `sales` (`id`, `code`, `quantity`, `price`, `sum`, `idCheck`)
и при это для id указывать null не обязательно, проще убрать id из запроса. А проверить надо с параметрами таблицы prais_informations? Что с чем?
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
09.11.2020, 15:07
|
Интересующийся
|
|
Регистрация: 07.11.2020
Сообщений: 16
|
|
SELECT prais_informations.stock <= количество для товара 0* FROM prais_informations WHERE prais_informations.code = код товара 0*
...
SELECT prais_informations.stock <= количество для товара n* FROM prais_informations WHERE prais_informations.code = код товара n*
* - приходит в запросе от клиентской части.
где n количество товаров в текущем заказе, товары не дублируются, если хотя бы один из этих запросов возвращает false заказ дальше не идет, запись в БД не происходит.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
09.11.2020, 15:12
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Что с чем сравнивать? Это не сравнение, это получение параметров из другой таблицы. С какими полями таблицы `sales` нужно сравнивать эти параметры?
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
09.11.2020, 15:17
|
Интересующийся
|
|
Регистрация: 07.11.2020
Сообщений: 16
|
|
sales: таблица в которую просто идет запись(тот самый мульти инсерт, c этой таблицей ничего сравнивать не нужно, в неё только запись)
sales
prais_information AS pi: таблица в которой лежат остатки, от клиента приходит массив вида [id, quantity, price, sum]
Соответственно pi.code === id and pi.stock >= quantity
pi
Последний раз редактировалось andrew76, 09.11.2020 в 15:21.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
09.11.2020, 16:34
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Да, не получится при многострочной вставке проверить, так как нельзя выбрать группы записей у несуществующего и сослаться не на что. Без временной таблицы не обойтись. Только в цикле:
var data = [
[code, quantity, ....],
[code, quantity, ....],
....
];
data.forEach((d)=> {
query('INSERT INTO sales (code, quantity, ...) SELECT ' + d.join(',') + ' WHERE (SELECT stock FROM pi WHERE code=' + d.code + ') >=' + d.quantity)
})
Последний раз редактировалось laimas, 09.11.2020 в 17:15.
|
|
|
|