原子[移动到另一个表,然后删除原始数据]

时间:2010-05-20 15:56:03

标签: mysql atomic

我有一个数据表和一个存档表。

网络应用将数据注入数据表,而cron作业每小时将数据拉出并将其存档在存档表中(这样可以保留数据表小而且快速使用)。

我看到它有两个运行的psudo-SQL查询:

INSERT Archive SELECT * FROM Data;

&安培;

DELETE FROM Data;

但是,我只想删除已成功复制的数据,如果复制失败,我希望它保持一致状态,数据既不会被移动也不会被删除。

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:6)

进行交易。

start transaction;
insert into archive select * from data;
delete from data where primary_key in (select primary_key from archive);
commit;

答案 1 :(得分:1)

我建议使用多表删除语法,并加入存档表以进行删除。这样,您只能删除两个表中的行。

简单示例:

insert into archive select * from data;
delete data.*
from data
inner join archive on archive.id = data.id;

除此之外,您可能需要考虑将其分解为更小的块以获得更好的性能。 例如:

insert into archive select * from data where id > 1000 and id <= 2000;
delete data.*
from data
inner join archive on archive.id = data.id
where data.id > 1000 and data.id <= 2000;

从手册中: http://dev.mysql.com/doc/refman/5.1/en/delete.html