복붙노트

[SQL] PostgreSQL의에서 '이 복사'중 중복 키를 무시하려면

SQL

PostgreSQL의에서 '이 복사'중 중복 키를 무시하려면

나는 테이블 PostgreSQL을에 파일에서 대량의 데이터를 덤프해야합니다. 나는 그것이 ''무시 'MySQL의에서 수행으로 등'대체 지원하지 않습니다 알고있다. 웹이에 관한 거의 모든 게시물은 '...하지가 존재하는 ... 선택 ... 삽입'이 작업을 수행 한 후 임시 테이블에 데이터를 덤프와 같이 같은 일을 제안했다.

이 파일 데이터 자체는 중복 된 기본 키를 포함 한 경우에 도움이되지 않습니다. 모든 몸은 PostgreSQL의에서이 문제를 처리하는 방법에 대한 아이디어가?

추신 도움이된다면 나는, 자바 프로그램에서이 일을하고있다

해결법

  1. ==============================

    1.당신이 설명한 것과 동일한 접근 방식을 사용하지만, 기본 테이블에로드하기 전에 임시 테이블에 (... 나 그룹 또는 수정) 중복 PK를 삭제합니다.

    당신이 설명한 것과 동일한 접근 방식을 사용하지만, 기본 테이블에로드하기 전에 임시 테이블에 (... 나 그룹 또는 수정) 중복 PK를 삭제합니다.

    뭔가 같은 :

    CREATE TEMP TABLE tmp_table 
    ON COMMIT DROP
    AS
    SELECT * 
    FROM main_table
    WITH NO DATA;
    
    COPY tmp_table FROM 'full/file/name/here';
    
    INSERT INTO main_table
    SELECT DISTINCT ON (PK_field) *
    FROM tmp_table
    ORDER BY (some_fields)
    

    세부 : TABLE AS를 생성, 복사, DISTINCT ON

  2. ==============================

    2.PostgreSQL의 9.5 지금 upsert 기능이 있습니다. 그 마지막 INSERT 충돌 DO의 NOTHING ON 절을 포함 제외하고 당신은 이고르의 지시를 따를 수 있습니다.

    PostgreSQL의 9.5 지금 upsert 기능이 있습니다. 그 마지막 INSERT 충돌 DO의 NOTHING ON 절을 포함 제외하고 당신은 이고르의 지시를 따를 수 있습니다.

    INSERT INTO main_table
    SELECT *
    FROM tmp_table
    ON CONFLICT DO NOTHING
    
  3. ==============================

    3.이고르의 대답은 나에게 많은 도움이 있지만, 나는 또한 네이트는 그의 주석에서 언급 한 문제에 달렸다. 그리고 내가 가진 문제 - 어쩌면 여기-것을 질문 새로운 데이터는 내부적으로 중복을 포함 할뿐만 아니라 기존 데이터와 중복하지 않았다 외에도한다. 무엇 나를 위해 일한 것은 다음이었다.

    이고르의 대답은 나에게 많은 도움이 있지만, 나는 또한 네이트는 그의 주석에서 언급 한 문제에 달렸다. 그리고 내가 가진 문제 - 어쩌면 여기-것을 질문 새로운 데이터는 내부적으로 중복을 포함 할뿐만 아니라 기존 데이터와 중복하지 않았다 외에도한다. 무엇 나를 위해 일한 것은 다음이었다.

    CREATE TEMP TABLE tmp_table AS SELECT * FROM newsletter_subscribers;
    COPY tmp_table (name, email) FROM stdin DELIMITER ' ' CSV;
    SELECT count(*) FROM tmp_table;  -- Just to be sure
    TRUNCATE newsletter_subscribers;
    INSERT INTO newsletter_subscribers
        SELECT DISTINCT ON (email) * FROM tmp_table
        ORDER BY email, subscription_status;
    SELECT count(*) FROM newsletter_subscribers;  -- Paranoid again
    

    내부 및 외부 중복하여 tmp_table 동일하고 DISTINCT ON (이메일) 부분을 제거하게된다. 순서에 따라 원하는 행이 다음 파기 먼저 결과 집합 및 DISTINCT 모든 추가 행을 제공해야합니다.

  4. ==============================

    4.당신은 중복을 제거하도록 키에 의해 그룹화 된 임시 테이블에 삽입

    당신은 중복을 제거하도록 키에 의해 그룹화 된 임시 테이블에 삽입

    다음하지 삽입이있는 경우

  5. from https://stackoverflow.com/questions/13947327/to-ignore-duplicate-keys-during-copy-from-in-postgresql by cc-by-sa and MIT license