2010-05-20 10 views
1

나는 데이터 테이블과 아카이브 테이블을 가지고 있습니다.원자 [다른 테이블로 이동 한 다음 원래 데이터 삭제]

웹 애플리케이션은 데이터 테이블에 데이터를 쏟아 및 cron 작업은 아카이브 테이블의 모든 시간과 아카이브를 (이 작은 작업하기 재빨리 데이터 테이블을 유지) 데이터를 가져옵니다. 그러나

INSERT Archive SELECT * FROM Data; 

&

DELETE FROM Data; 

난 단지 복사가있는 경우, 성공적으로 복사 된 데이터를 삭제하려면, : 제가보기에는

실행이 psudo-SQL 쿼리가 있습니다 실패 나는 데이터가 반 이동도 삭제되지 않고 일관된 상태로 유지되기를 원한다.

어떻게해야할까요?

답변

6

거래 중.

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

일부 데이터베이스 시스템 은 업데이트에 거래 중 쿼리에없는 일관성있는, 그래서 "데이터에서 삭제"또는이었다 물건을 삭제하지 않을 수있다 삽입 후에 추가 된 것이므로 삭제시 쿼리를 사용하는 것이 좋습니다. –

+0

하위 쿼리의 아카이브 테이블에서 선택하려고 생각합니다.'primary_key in (select primary_key from archive); –

+2

또한 begin transaction은 유효한 MySQL 명령이 아닙니다. 적절한 명령은'start transaction'입니다. –

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

관련 문제