Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Присвоение записи в таблице Mysql (https://javascript.ru/forum/server/25881-prisvoenie-zapisi-v-tablice-mysql.html)

posta 18.02.2012 17:23

Присвоение записи в таблице Mysql
 
Подскажите, существует ли такая возможность:
Есть две таблицы идентичные. Надо взять запись (одну или несколько) и скопировать в другую таблицу, а из первой удалить.

nyols 18.02.2012 18:25

INSERT INTO
   `tbl` (`filed`, `other_field`)
SELECT
   `some_field`,
   `second_field`
FROM
   `other_tbl`

А вот удалить уже придется отдельным запросом помоему

nekto_O 19.02.2012 00:41

ну по сути здесь 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

posta 19.02.2012 03:33

nekto_O,
блин, это сложно... спасибо за ответ. буду над этим разбираться...

nekto_O 19.02.2012 09:51

Цитата:

Сообщение от posta
блин, это сложно...

Ничего сложного здесь на самом деле нет и в помине. Разобравшись 1 раз с логикой создания сущностей(вьюх, хранимок, триггеров и т.д.), вы, во-первых, избавляете себя от лишних строк кода в скрипте, будь то java, С#, php и др. Во-вторых, обеспечиваете оптимальную скорость обработки запроса, объединив всю логику в одну транзакцию.


Часовой пояс GMT +3, время: 12:50.