MySQL — Вставить в таблицу и получить идентификатор этого для вставки в другую таблицу — все в одном запросе

#mysql

#mysql

Вопрос:

У меня есть exercise_logs таблица с этими столбцами:

user_id | exercise_name | mood_log_id | weight_log_id | stretch_log_id

У меня есть три таблицы ( mood_logs , weight_logs и stretch_logs ), первичный ключ которых хранится в 3 последних трех соответствующих столбцах exercise_logs .

Это столбцы моей mood_logs таблицы:

id | mood_scale


Итак, я хочу создать новую mood_logs запись и использовать id из нее и сохранить ее exercise_log . Но я хочу сделать все это в одном запросе.

Вот что я пробовал до сих пор:

 INSERT INTO `exercise_logs` (`exercise_name`, `user_id`, `mood_log_id`)
    values('Breathing', 190, (INSERT INTO `mood_logs` (`mood_scale`)
                values(9); LAST_INSERT_ID()))
 

Но это не работает.

Возможно ли достичь этого в одном запросе?

Большое вам спасибо.

Ответ №1:

Вы можете попробовать этот первый запрос вставить в mood_logs

 INSERT INTO `mood_logs` (`mood_scale`)
                values(9);
 

2-й запрос вставить в exercise_logs

  INSERT INTO `exercise_logs` (`exercise_name`, `user_id`, `mood_log_id`)
        values('Breathing', 190, (SELECT `mood_scale` FROM `mood_logs` WHERE `mood_scale` = 9))
 

Ответ №2:

Сначала вам нужно INSERT ввести строку mood_logs .

Поскольку последний вставленный идентификатор взят из приведенного выше утверждения.

Вы можете использовать last_insert_id() непосредственно во втором операторе insert.

 INSERT INTO `mood_logs` (`mood_scale`) values (9);
INSERT INTO `exercise_logs` (`exercise_name`, `user_id`, `mood_log_id`) values('Breathing', 190, last_insert_id());
 

Это предполагает, что вы единственный, кто использует базу данных. Если кто-то другой использует оператор INSERT до того, как вы сможете использовать last_insert_id() then, идентификатор МОЖЕТ быть равен любому идентификатору последнего оператора insert.

Также можно использовать переменные для хранения last_insert_id() ;

 INSERT INTO `mood_logs` (`mood_scale`) values (9);
SET @arbitraryVariableName = last_insert_id();
INSERT INTO `exercise_logs` (`exercise_name`, `user_id`, `mood_log_id`) values('Breathing', 190, @arbitraryVariableName);