ну по сути здесь 2 более-менее нормальных варианта:
1. Написать огромный запрос в котором будет выполняться транзакция, содержащая все необходимые операции. Но здесь есть подводные камни, например далеко не все мускульные драйверы смогут корректно обработать ответ, да и скорость выполнения такого запроса будет невелика.
2. Создать хранимую процедуру(системный объект БД) которая в качестве параметра будет принимать идентификатор, записи в 1-й таблице, производить необходимые операции и отдавать результат своей работы. скорость выполнения транзакции будет несравнимо выше, поскольку мускль будет юзать свой собственный системный объект (хранимую процедуру), которая будет кэшироваться после первого запуска (по дефолту).
Вот пример:
DELIMITER //
create procedure `MyDB`.`myproc` ( -- здесь MyDB - имя БД, myproc - имя процедуры
IN `id` int
)
begin
declare flag int;
set flag = (select `a` from `table1` where `a` = `id`);
-- здесь проверяем существует ли в таблице table1 нужная запись
-- если существует, тогда производим все операции и отдаем идентификатор добавленной записи
if flag is not null then
begin
insert into `table2` (`d`, `e`, `f`) -- d, e, f - имена полей в таблице table2
select `a`, `b`, `c` from `table1` where `a` = `id`; -- a, b, c - имена полей в таблице table1
delete from `table1` where `a` = `id`;
select `d` from `table2` where `d` = `id`;
end;
-- в противном случае отдаем "error: there is no record in the table" (для примера),
-- дабы затем сказать клиенту об ошибке (не обязательно)
else
select "error: there is no record in the table";
end if;
end //
Далее эту процедуру можно вызывать один или несколько раз (в цикле) в зависимости от количества записей, которые нужно скопировать из table1 в table2.
call myproc(1) -- вызов процедуры myproc с параметром id равным 1