2010-05-20 18 views
1

我有一個數據表和一個存檔表。原子[移至其他表格,然後刪除原來的數據]

web應用程序倒數據到數據表,每隔一小時和檔案它在存檔表(該保持數據表小,快一起工作)cron作業拉出來的數據。

在我看來有兩個psudo-SQL查詢來運行:

INSERT Archive SELECT * FROM Data; 

&

DELETE FROM Data; 

不過,我只是想刪除已成功複製的數據,如果複製失敗我希望它保持一致的狀態,數據既不會被半移動也不會被刪除。

什麼是正確的方法來做到這一點?

回答

6

有交易。

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

一些數據庫系統是在交易過程中的查詢並不一致,僅在更新,所以「從數據中刪除」可能會或可能不會刪除任何東西,這是插入後添加,這就是爲什麼我建議在刪除中使用查詢。 – 2010-05-20 16:02:21

+0

我想你打算從子查詢中的歸檔表中選擇:'從primary_key中刪除數據(從歸檔中選擇primary_key);' – 2010-05-20 20:52:40

+2

另外,'begin transaction'不是有效的MySQL命令。正確的命令是「開始事務」。 – 2010-05-20 20:55:39

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