@Dark_Dante

Как правильно написать сложную хранимую процедуру?

Здравствуйте.
Есть таблица backet. В ней поля id, description и всякая фигня.
Есть вторая таблица backet_state, в ней поля id_backet, id_user, id_status
Есть третья таблица orders, в ней id, timestamp, phone, comment
Четвертая таблица order_state, где есть id_backet, id_order

Хочу сделать следующее. Хранимой процедурой в таблице backet_state для заданного id_user все значения id_status поменять, допустим, с 1 на 2, В таблицу orders добавить новую запись. В таблицу order_state добавить записи с id_backet, над которыми были произведены операции по смене статуса, со свежедобавленным id от операции создания новой записи в orders.
Как я себе это представляю
DELIMITER $$

CREATE
    
    PROCEDURE `toOrder`(IN var_user_id INT, IN var_phonenumber VARCHAR(255), IN var_comment TEXT)
    
    BEGIN
	UPDATE backet_state SET  id_status=2 WHERE id_user= var_user_id  AND id_status=1;
	INSERT INTO orders (phone, `comment`) VALUES (var_phonenumber, var_comment);
	INSERT INTO order_state (id_order, id_backet) SELECT  LAST_INSERT_ID(), id_backet FROM backet_state WHERE id_status=2 AND id_user= var_user_id;
    END$$


Но. Будет ли функция LAST_INSERT_ID() будет возвращать мне каждый раз тот id, который был получен в ходе первого инсерта? Или нет?
Если нет, то надо после первого инсерта куда то сохранить результат LAST_INSERT_ID(), а во втором инсерте это значение получить и уже его вставить в подзапрос SELECT. Как это лучше сделать то?
  • Вопрос задан
  • 357 просмотров
Решения вопроса 1
@BorisKorobkov Куратор тега MySQL
Web developer
Будет ли функция LAST_INSERT_ID() будет возвращать мне каждый раз тот id, который был получен в ходе первого инсерта?

Последнего инсерта.
В указанном примере вроде все правильно. Ибо на момент вызова LAST_INSERT_ID() последним был INSERT INTO orders.

P.S. Лично мне хранимые процедуры не нравятся: сложно дебажить, гемор с рутовыми правами и много других неочевидных проблем.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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