Ответ 1
Простой оператор INSERT INTO SELECT:
INSERT INTO persons_table select * from customer_table where person_name = 'tom';
DELETE FROM customer_table where person_name = 'tom';
Если у меня две одинаковые по структуре таблицы, как я могу переместить набор строк из одной таблицы в другую?
Набор строк будет определен из запроса выбора.
например:
customer table
person_id | person_name | person_email
123 tom [email protected]
persons table
person_id | person_name | person_email
выборка выборки будет следующей:
select * from customer_table where person_name = 'tom';
Я хочу переместить строку из таблицы клиентов в таблицу
В идеале удаление данных из исходной таблицы, но это не будет прерывание транзакции.
Простой оператор INSERT INTO SELECT:
INSERT INTO persons_table select * from customer_table where person_name = 'tom';
DELETE FROM customer_table where person_name = 'tom';
INSERT INTO Persons_Table (person_id, person_name,person_email)
SELECT person_id, customer_name, customer_email
FROM customer_table
WHERE "insert your where clause here";
DELETE FROM customer_table
WHERE "repeat your where clause here";
Ответ Fabio действительно хорош, но требуется длительное время выполнения (как уже писал Trilarion)
У меня есть другое решение с более быстрым выполнением.
START TRANSACTION;
set @N := (now());
INSERT INTO table2 select * from table1 where ts < date_sub(@N,INTERVAL 32 DAY);
DELETE FROM table1 WHERE ts < date_sub(@N,INTERVAL 32 DAY);
COMMIT;
@N получает отметку времени в начале и используется для обеих команд. Все в транзакции, чтобы никто не беспокоился.
INSERT INTO Persons_Table (person_id, person_name,person_email)
SELECT person_id, customer_name, customer_email
FROM customer_table
ORDER BY `person_id` DESC LIMIT 0, 15
WHERE "insert your where clause here";
DELETE FROM customer_table
WHERE "repeat your where clause here";
Вы также можете использовать ORDER BY, LIMIT и ASC/DESC для ограничения и выбора конкретного столбца, который вы хотите переместить.
Мне пришлось решить ту же проблему, и это то, что я использовал в качестве решения.
Чтобы использовать это решение, таблица источника и получателя должна быть идентичной, и в первой таблице должен быть уникальный идентификатор и автоинкремент (чтобы один и тот же идентификатор никогда не использовался повторно).
Предположим, что таблица1 и таблица2 имеют эту структуру
|id|field1|field2
Вы можете сделать эти два запроса:
INSERT INTO table2 SELECT * FROM table1 WHERE
DELETE FROM table1 WHERE table1.id in (SELECT table2.id FROM table2)
BEGIN;
INSERT INTO persons_table select * from customer_table where person_name = 'tom';
DELETE FROM customer_table where person_name = 'tom';
COMMIT;