2010-12-10 1 views
0

업로드 할 컴퓨터에서 CSV (사전 ​​결정된 형식)를 선택할 수있는 클라이언트 용 업 로더 (PHP 사용)를 설정 중입니다. CSV는 4000-5000 행을 가질 가능성이 큽니다. Php는 CSV의 각 행을 읽고 DB 테이블에 직접 삽입하여 파일을 처리합니다. 그 부분은 쉽습니다.MySQL에 혼합 덮어 쓰기/추가 일괄 쓰기가 가능합니까?

그러나이 데이터를 데이터베이스 테이블에 추가하기 전에 3 개의 열 (A, B 및 C)을 검토하고 해당 필드의 일치하는 콤보가 이미 있는지 확인하고 싶습니다. 테이블 그래서 만약 내가 오히려 그 행을 추가하는 것보다 오히려 업데이 트됩니다. 일치하는 콤보 3 개 열이 없다면 테이블에 데이터를 추가하고 행을 INSERT하는 것이 좋습니다.

내 첫 번째 생각은 내 테이블에서 고유 인덱스 인 A, B 및 C 열을 만들 수 있으며 모든 행을 INSERT하고 INSERT (내 고유 인덱스의 제한으로 인해) INSERT를 감지하고 그런 다음 업데이트하십시오. 이 방법은 각 테이블에 이미 일치하는 콤보가 있는지를보기 위해 각 행에 대해 별도의 SELECT 쿼리를 작성하는 것보다 효율적일 수 있습니다.

세 번째 방법은 단순히 MySQL 고유 인덱스를 사용하지 않고 모든 것을 추가 한 다음 클라이언트가 나중에 해당 테이블을 쿼리 할 때만 최신 고유 조합을 가져 오는 것입니다. 그러나 나는 그 테이블에 쓸모없는 데이터 톤을 피하려고 노력하고있다.

우수 사례 또는 영리한 접근법에 대한 생각? 당신은 (A, B, C) 열에 고유 인덱스를 추가하는 경우

답변

1

당신이 만드는 경우 유엔 3 열 ID가 중복되면 ON DUPLICATE KEY를 사용하여 INSERT를 수행 할 수 있습니다.

INSERT INTO table (a,b,c,d,e,f) VALUES (1,2,3,5,6,7) 
    ON DUPLICATE KEY UPDATE d=5,e=6,f=7; 

이 편리한 기술에 대한 자세한 내용은 MySQL manual에서 확인할 수 있습니다.

+0

매우 편리한 기술입니다. – phirschybar

+0

기꺼이 도와 드리겠습니다. 이것은 내가 얻은 편리한 트릭입니다. –

1

, 당신은 하나 개의 문장에서이 작업을 수행 할 REPLACE를 사용할 수 있습니다

그 경우를 제외하고, 정확하게 INSERT 같은 을 작품을 교체 새로운 행이 이 삽입되기 전에 테이블 오래된 행은 PRIMARY KEY 또는 UNIQUE 인덱스에 대한 새 행과 동일한 값을 가지고, 이전 행 ... 삭제

+0

ON DUPLICATE를 사용할 때와 마찬가지로 작동합니다. 감사. – phirschybar

관련 문제