2015-02-02 3 views
0

매일 밤 cron 작업으로 업데이트되는 MySQL 테이블이 있습니다. XLS 파일에서 데이터를 가져오고 모든 값을 업데이트해야하므로 모든 행이 변경됩니다.MySQL "UPSERT"및 영향을받지 않는 행을 삭제하십시오.

첫 번째 질문은 각 행을 업데이트 할 가치가 있거나 다른 한편으로는 모두 삭제하고 다시 삽입하는 것이 었습니다. 나는 그것이 더 정확하고 빠르며 모든 데이터를 버리는 우아한 것을 읽었을 때 UPSERT 방법을 고수해 왔지만 내가 틀렸다면 나를 교정 해주십시오.

글쎄, 이제 내 질문은 새로운 것이 아니며 cron이 실행될 때마다 업데이트되지 않는 행에 관한 것입니다. XLS는 고정 길이가 아닐 수도 있으므로 언젠가는 몇 줄을 줄여도됩니다.

동일한 "UPSERT"명세서에서 어떻게 행을 삭제할 수 있습니까?

편집 : 나는 것을 어쩌면 이 경우에가 처음 내 목표는 그 피되었지만, 오래된 데이터를 삭제하고 추가 다시 단지 더 깨달았다.

답변

1

& 때마다 모든 행이 업데이트되므로 변경하지 않는 행을 확인할 방법이 없습니까? 간단히 말하자면 & 대량 삽입을 모두 잘라내시겠습니까?

+0

답장을 보내 주셔서 감사합니다. 테이블 전체를 삭제하고 매번 모든 데이터를 다시 삽입한다는 의미입니까? 제가 말씀 드렸듯이, 이것이 저의 첫 번째 의도 였지만 데이터 가용성과 전문성/우수성 관점에서 신뢰할 수없는 것으로 보입니다. 나는 이것을 피하고 더 깨끗한 솔루션을 구현하고 싶다. 많은 사람들에게 공통적 인 시나리오 일 수 있기 때문에 내가 묻는 것을하기위한 메커니즘이 이미 존재한다면 나는 생각하고 있었다. – Alberto

+0

일반적인 시나리오는 아닙니다. 오래된 데이터를 원하지 않는다면 왜 데이터 가용성에 대해 걱정하고 있습니까? upsert 조작을 수행하는 동안 하나의 파일에서 표의 데이터와 일치하지 않는 것을 식별 할 수있는 표준 방법은 없습니다. 오래된 데이터 (주어진 파일에는 존재하지 않음)가 필요 없다면 그 데이터를 유지하는 것이 무엇을 의미합니다. –

+0

오래된 데이터를 보관하고 싶지 않습니다. 삭제하는 방법에 관한 질문입니다. 따라서 간단히 말해이 경우 delete-all/insert-all 작업이 더 좋을 것이라고 생각하십니까? – Alberto

0

DROPping 또는 TRUNCATEing보다 나은 점은 다음과 같습니다. 중단 시간이 없기 때문입니다.

CREATE TABLE new LIKE real; 
LOAD DATA or otherwise do bulk INSERT into `new` 
RENAME TABLE real TO old, new TO real; 
DROP TABLE old; 

나는 내가 대량로드는 어떻게 든 노는 느슨한 모든 것을하지 않았는지 확인하는 기회가 될 때까지 old에 손을 좋아한다.

테이블이 차단되는 유일한 시간은 RENAME인데 너무 빠르며 "중단 시간 없음"이라고 말합니다.

관련 문제