Mysql-将行从一个表移动到另一个表

如果我有两个结构相同的表,我怎样才能将一组行从一个表移动到另一个表?

行集将从选择查询中确定。

例如:

customer table


person_id | person_name | person_email
123         tom           tom@example.com




persons table


person_id | person_name  | person_email

一个样本选择是:

select * from customer_table where person_name = 'tom';

我要将该行从 customer 表移动到 person 表

理想情况下,从原始表中删除数据,但这不会破坏交易。

136182 次浏览

一个简单的 < strong > INSERT INSERT INSELECT 声明:

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";

我必须解决同样的问题,这就是我用来作为解决方案。

要使用此解决方案,源表和目标表必须是相同的,并且在第一个表中必须具有唯一的 id 和自动增量(这样相同的 id 永远不会被重用)。

假设表1和表2具有这种结构

|id|field1|field2

您可以进行以下两个查询:

INSERT INTO table2 SELECT * FROM table1 WHERE


DELETE FROM table1 WHERE table1.id in (SELECT table2.id FROM table2)

法比奥的回答确实不错,但是需要很长的执行时间(就像 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";

还可以使用 ORDERBY、 LIMIT 和 ASC/DESC 来限制和选择要移动的特定列。

BEGIN;
INSERT INTO persons_table select * from customer_table where person_name = 'tom';
DELETE FROM customer_table where person_name = 'tom';
COMMIT;

通过使用 WHERE 查询选择移动和删除特定记录,

BEGIN TRANSACTION;
Insert Into A SELECT * FROM B where URL="" AND email ="" AND Annual_Sales_Vol="" And OPENED_In="" AND emp_count=""  And contact_person= "" limit 0,2000;
delete from B where Id In (select Id from B where URL="" AND email ="" AND Annual_Sales_Vol="" And OPENED_In="" AND emp_count="" And contact_person= "" limit 0,2000);
commit;

通过从第一个表中删除数据,这两种方法可以很好地将数据从一个表移动到另一个表。但是请记住,在这种情况下,第一个表的 id 是 auto _  增量,它不會重新排列 id,所以在这种情况下,如果您的表有幾十億數據,而且仍然在增加,那么它可能不适合您:

一个简单的例子是提供一个 id 范围,您可以从中移动数据:

    INSERT INTO old_authors SELECT * FROM authors WHERE id > 1000;
DELETE FROM authors WHERE id > 1000;

如果你想查找带有日期范围的数据,可以试试这个:

INSERT INTO old_authors SELECT * FROM authors WHERE DATE_FORMAT(added, "%Y-%m-%d") > "2022-05-01";
DELETE FROM authors WHERE DATE_FORMAT(added, "%Y-%m-%d") > "2022-05-01";

此外,使用横切并承诺:

START TRANSACTION;
INSERT INTO old_authors SELECT * FROM authors WHERE DATE_FORMAT(added, "%Y-%m-%d") > "2022-04-24";
DELETE FROM authors WHERE DATE_FORMAT(added, "%Y-%m-%d") > "2022-04-24";
COMMIT;