Сделать два зависимых INSERT в разные таблицы одним запросом postgresql?

Здравствуйте.
Подскажите, необходимо сделать два insert в разные таблицы, в одном запросе. При том, что второй insert зависит от результатов первого. И при этом, данные точно должны быть вставлены в обе таблицы, и если по какой-то причине данные не вставились в одну из таблиц, то и во второй их быть не должно.
Если что, запрос отправляю из Node в postgresql.
Понимаю, что нужна транзакция, но пока не могу понять, как использовать результат вставки.
Пример запросов.

INSERT INTO public.users(first_name, second_name, password) VALUES ($1, $2, $3) RETURNING id

INSERT INTO public.user_phone_number(user_id, phone_number) VALUES ($1, $2) RETURNING phone_number


В переменной $1 второго запроса, нужно использовать id, возвращаемый первым запросом.
  • Вопрос задан
  • 2973 просмотра
Решения вопроса 1
@VelkinVV Автор вопроса
Решить вопрос можно двумя способами.
Первый
WITH user_data AS (INSERT INTO public.users(first_name, second_name, password) 
				VALUES ($1, $2, $3) RETURNING id, first_name, second_name), 
				user_phone AS (INSERT INTO public.user_phone_number(user_id, phone_number) 
				VALUES ((SELECT id FROM user_data), $4) RETURNING user_id, phone_number) 
				SELECT ud.id, ud.first_name, ud.second_name, up.phone_number 
				FROM user_data AS ud INNER JOIN user_phone AS up 
				ON up.user_id = ud.id


Второй
DO $$
DECLARE tableId bigint;
BEGIN
INSERT INTO public.users(first_name, second_name, password) VALUES ($1, $2, $3) RETURNING id INTO tableId;
INSERT INTO public.user_phone_number(user_id, phone_number) VALUES (tableId, $4);
COMMIT;
END $$;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
yellow79
@yellow79
Senior Software Engineer
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы