Присвоение записи в таблице Mysql
Подскажите, существует ли такая возможность:
Есть две таблицы идентичные. Надо взять запись (одну или несколько) и скопировать в другую таблицу, а из первой удалить. |
INSERT INTO `tbl` (`filed`, `other_field`) SELECT `some_field`, `second_field` FROM `other_tbl` А вот удалить уже придется отдельным запросом помоему |
ну по сути здесь 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 |
nekto_O,
блин, это сложно... спасибо за ответ. буду над этим разбираться... |
Цитата:
|
Часовой пояс GMT +3, время: 12:50. |