[SQL] 대량으로 PostgreSQL을 만 새로운 행을 삽입하는 방법
SQL대량으로 PostgreSQL을 만 새로운 행을 삽입하는 방법
단지 제목 - 나는 ID가없는 제품 (300 만 개 항목)의 목록을 가지고있다. 그러나 나는 이미 DB에 존재하는 제목 모른다. 신제품 (만 2.9에 대한 항목) DB에 추가해야합니다. 그 후 나는 각 제품 ID (신규 및 기존)를 알고 있어야합니다.
PostgreSQL의에서 할 수있는 가장 빠른 방법이 있나요? 나는 (추가 기본값 등 열을 추가) 필요에 따라 DB를 변경할 수 있습니다.
해결법
-
==============================
1.목표 테이블에 복사 임시 준비 테이블에 이르기까지 모든 및 삽입에만 새로운 제목.
목표 테이블에 복사 임시 준비 테이블에 이르기까지 모든 및 삽입에만 새로운 제목.
CREATE TEMP TABLE tmp(title text); COPY tmp FROM 'path/to/file.csv'; ANALYZE tmp; INSERT INTO tbl SELECT DISTINCT tmp.title FROM tmp LEFT JOIN tbl USING (title) WHERE tbl.title IS NULL;
ID는 TBL에 직렬 컬럼 tbl_id 자동으로 생성한다.
왼쪽은 / NULL 구조체의 못해도는 기존 IS 타이틀 가입. NOT 또 다른 가능성 것이 존재한다.
DISTINCT 방지는 임시 테이블의 tmp에서 들어오는 데이터를 복제합니다.
ANALYZE 확실히 쿼리 계획은 현명한 계획을 선택합니다 만들기 위해 유용하고, 임시 테이블은 자동 진공에 의해 분석되지 않습니다.
당신이 3 개 백만 항목이 있기 때문에, (이 세션에만 해당) temp_buffer에 대한 설정을 높이기 위해 비용을 지불 할 수 :
SET temp_buffers = 1000MB;
아니면 아무리 당신이 감당할 훨씬 빠른 인 RAM에 임시 테이블을 저장하기에 충분하다 할 수 있습니다. 참고 : - 모든 임시 객체가 생성되기 전에 세션에서 먼저 수행해야합니다.
가져온 데이터에 대한 모든 ID를 확인하려면 :
SELECT tbl.tbl_id, tbl.title FROM tbl JOIN tmp USING (title)
같은 세션에서! 임시 테이블은 세션이 끝날 때 자동으로 삭제됩니다.
from https://stackoverflow.com/questions/15834569/how-to-bulk-insert-only-new-rows-in-postresql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 외국 언어와 MySQL의 쿼리를 선택하려면? (0) | 2020.06.17 |
---|---|
[SQL] 2 열 조합에 SQL 고유 제한 조건 (0) | 2020.06.17 |
[SQL] SQL 업데이트는 MS Access에서 비애 - 작업이 업데이트 가능한 쿼리를 사용해야합니다 (0) | 2020.06.17 |
[SQL] 어떻게 오라클의 기존 테이블에 (또는 GET)는 DDL 스크립트를 생성 할 수 있습니까? I가이 하이브에서 그들을 다시 작성 (0) | 2020.06.17 |
[SQL] 저장하는 룩업 테이블 아이디의 순수 데이터 간의 의사 (0) | 2020.06.16 |