Показать сообщение отдельно
  #3 (permalink)  
Старый 19.02.2012, 00:41
С++/C# modest developer
Отправить личное сообщение для nekto_O Посмотреть профиль Найти все сообщения от nekto_O
 
Регистрация: 07.11.2011
Сообщений: 244

ну по сути здесь 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
Ответить с цитированием