@entermix

Можно ли выполнить UPDATE + INSERT одним запросом?

Составил запрос:
UPDATE `users` SET `balance` = balance + 11 WHERE `id` = '1' AND (INSERT INTO `payments` (`status_id`, `user_id`, `description`, `currency_id`, `amount`, `bonus_amount`, `sum`) VALUES ('2', '1', 'TEST', 643, 11, 22, 11)) LIMIT 1


При выполнении происходит ошибка:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INTO `payments` (`status_id`, `user_id`, `description`, `currency_id`, `amo' at line 1


По отдельности запросы работают. Что я делаю неправильно?
  • Вопрос задан
  • 1696 просмотров
Решения вопроса 3
disc
@disc
веб-разработчик
Нельзя так сделать.
Разбейте запрос на 2 части: INSERT отдельно, UPDATE отдельно; и заверните в транзакцию.
Баланс пользователя лучше высчитывать запросом из payments таблицы чем просто плюсовать.
Ответ написан
27cm
@27cm
TODO: Написать статус
Не понятно, зачем INSERT засовывать внутрь UPDATE? Выполняйте по отдельности, заворачивайте в транзакцию.
dev.mysql.com/doc/refman/5.7/en/commit.html
Ответ написан
@Joysi75
Если нужно 2 эти операции делать в связке, то можно закрепить это поведение в самой БД через триггер, который после выполнения UPDATE сам инициирует необходимый INSERT. Логику insert-а (в вопросе уже готовые значения) пропишите в теле триггера (для Update возможен доступ к значениям до выполнения команды через псевдозапись (или как правильно в Maria они называются) OLD, к новым значениям - через псевдозапись NEW.

CREATE TRIGGER `update_users` AFTER UPDATE ON `users`
FOR EACH ROW 
BEGIN
   INSERT INTO payments(status_id, user_id, description, currency_id, 
       amount, bonus_amount, sum) 
    values('2' ,new.id, 'test', 643, 
       old.balance, old.balance+new.balance, new.balance);
END;


тут свои + и -.
+) БД управляет сама поведением записей (на случай, если кто 'забудет' прописать вторую команду или оформить транзакцию, или кто вручную добавляет данные из PhpMySQLAdmin и т.п.) согласно заданной логике.
-) Нужно хорошо знать БД (где и что она хранит и т.п. ;) )
Вопрос производительности не имеет однозначного ответа, так как зависит от многих факторов (ресурсы и текущая нагрузка сервера, частота изменений ...)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы