Перемещение и удаление строк между таблицами MySQL - PullRequest
1 голос
/ 06 января 2011

Я использую следующий запрос для перемещения строк из одной таблицы в другую:

INSERT INTO `new_table` VALUES (SELECT * FROM `old_table` ORDER BY RAND() LIMIT 0,5)

Однако мне нужно удалить строки из old_table после их перемещения. Возможно ли это с помощью запроса, аналогичного приведенному выше?

Спасибо

Joel

Ответы [ 2 ]

1 голос
/ 06 января 2011

нет выбора

alter table old_table add column selected int(1) not null default 0;
update old_table set selected=1 order by rand() limit 5;
insert into new_table select * from old_table where selected=1;
delete from old_table where selected=1;

или вы оборачиваете его как хранимую процедуру, функция

1 голос
/ 06 января 2011

Обновление

При вставке подмножества данных вам необходимо следовать INSERT с DELETE, если вы используете InnoDB, заключите его в транзакциютак что действие является атомарным.

С ORDER BY RAND() у вас возникнет серьезная проблема, поскольку вы не будете знать, какие строки были удалены.Вероятно, понадобится временная таблица для хранения целевых строк.

BEGIN TRANSACTION;

CREATE TEMPORARY TABLE `target_keys`
    SELECT `id` FROM `old_table` ORDER BY RAND() LIMIT 0,5;

INSERT INTO `new_table` VALUES
    (SELECT * FROM `old_table` WHERE `id` IN (SELECT `id` FROM `target_keys`));

DELETE FROM `old_table` WHERE `id` IN (SELECT `id` FROM `target_keys`);

DROP TABLE `target_keys`;

COMMIT;

Ответ перед редактированием

Если вы перемещаете все строки какв вашем примере, почему бы просто не переименовать таблицу ?

RENAME TABLE old_name TO new_name

Если это подмножество данных, то вам нужно следовать за INSERT с помощью DELETE, если вы используете InnoDB, оберните его в транзакцию, чтобы действие было атомарным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...