2012-04-18 4 views
0

나는 약간의 볼륨을 다루지 만 변경이 불가능한 데이터 (update_history)와 현재 데이터를 보유하고있는 테이블 (이를 current_data).MySQL의 증분 업데이트 테이블

  • current_data가 포함 id이 (고유 한), value는, tstamp (현재 타임 스탬프)
  • update_history가 포함 id (다시, 독특한입니다), value, tstamp (모든 업데이트)

delete 난이 시간 8에서 2로 변경, 삭제, 다시 설정 시간 10되는 시간 5에서, 10으로 초기화 시간 0에서 id = 1. 특정 데이터를 말한다 10.이 모든 후, 나는 포함하도록 update_history을 싶습니다

Id Value Stamp Delete 
1 10  0  0 
1  2  5  0 
1  2  8  1 
1 10 10  0 

내가의 current_data 테이블에 대한 각 변경에 update_history 선택 값이 변경되는 경우 또는 ID가 삭제되었다 있는지 확인하고 삽입 할 수 있지만 행, 그것은 다소 과도한 것으로 보인다.

하나 또는 두 개의 쿼리 내에서이를 일괄 적으로 수행 할 방법을 찾고 있습니다. 특히, 나는 current_data의 각 id에 대한 update_history에서 해당 id를 확인하는 쿼리를 찾고 있어요, 그리고 update_history의 최신 tstamp 또는 id 가치 불일치가 발견되지 않으면, deletestamp, value, id에 행을 삽입 = 0이다.

도움이 될 것입니다.

답변

0

계속 진행 하시려면 MySQL에서 TRIGGERS에 대해 읽어보십시오.

그렇지 않은 경우 일회성 작업 인 경우 두 번의 쿼리를 통해 수행 할 수 있습니다. 역사에 새 행을 역사에서 마지막 값에 다른 값이 현재 테이블의 모든 행을 확인하고 삽입 할 첫 번째

다음
INSERT INTO update_history SELECT cd.id,cd.value,UNIX_TIMESTAMP(),0 
FROM current_data cd 
INNER JOIN update_history uh1 ON (cd.id=uh1.id AND cd.value!=uh1.value AND uh1.delete=0) 
WHERE uh1.stamp = (
SELECT MAX(stamp) 
FROM update_history uh2 
WHERE uh2.id=cd.id 
) 

에 항목이없는 현재의 모든 행을 식별하는 내역

INSERT INTO update_history SELECT cd.id,cd.value,UNIX_TIMESTAMP(),0 
FROM current_data cd 
LEFT JOIN update_history uh1 ON cd.id=uh1.id 
WHERE uh1.id IS NULL 

저는 디자인에 몇 가지 결함이 있다고 생각합니다. 예를 들어 타임 스탬프와 관련하여 두 가지 변경 사항이 동시에 발생하면 어떻게됩니까? 어느 것이 "처음"인지 어떻게 구별합니까? 히스토리 테이블에 고유 한 ID가 필요할 수 있습니다.