我有一个数据表和一个存档表。
网络应用将数据注入数据表,而cron作业每小时将数据拉出并将其存档在存档表中(这样可以保留数据表小而且快速使用)。
我看到它有两个运行的psudo-SQL查询:
INSERT Archive SELECT * FROM Data;
&安培;
DELETE FROM Data;
但是,我只想删除已成功复制的数据,如果复制失败,我希望它保持一致状态,数据既不会被移动也不会被删除。
这样做的正确方法是什么?
答案 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;