본문 바로가기
DB/RDBMS

[PSQL] COPY 작업 시 유용하게 사용했던 명령어 및 설정

by 소라둥이 2020. 4. 27.

앞서 포스팅한대로 COPY작업 자체는 잘 된다.

 

하지만 생각지도 못한 부분에서 많은 문제가 발생했다.

 

1. 한글깨짐

역시나 한글 깨짐 방지는 필수인것 같다.

copy 실행 전 SQL Shell의 인코딩을 UTF-8로 변경하면 된다.

 

set client_encoding to 'UTF8';

 

 

2. 구분자 문제

나 같은 경우는 MSSQL에서 데이터를 CSV로 생성 후 PSQL에서 COPY했다.

이때 구분자를 ,을 이용하였는데 데이터 안에 해당 구분자가 들어 있다면

데이터의 , 마저도 구분자로 인식하여 데이터를 컬럼단위로 잘라버렸다.

즉 원래 컬럼이 10개라면 11개가되는 현상이 발생, 정상적으로 실행이 안된다.

 

이전 포스팅에서 설정한 delimiter 옵션을 이용하여 구분자를 \t, ; 등 상황에 맞게 변경해서 사용하면 된다.

 

 

3. 숫자가 null(공백)일 때 발생하는 문제

CSV 파일의 숫자 컬럼이 Null 일 때 PSQL에서 COPY 시 null이 아닌 '' 이러한 공백으로 입력되고

숫자에는 문자가 들어갈 수 없기 때문에 에러가 발생한다.

 

copy 구문의 null as '' 라는 옵션을 주어 해결하면된다. 해당 문자를 null로 인식하라는 옵션이다.

 

 

4. copy 구문 동적 사용

데이터 복사 전 중복 데이터가 입력되는 것을 방지하기 위하여

delete from 테이블 where 조건을 이용하여 입력할 데이터와 같은 조건의 데이터를 삭제하고 시작한다.

COPY 구문이 하나면 상관 없지만 여러개 일 시 where 조건이 동적으로 변하지 않으면 모든 구문을 수정해야한다.

고로 동적으로 사용할 방법이 필요한데 프로시저가 아니므로 변수는 사용할 수없다.

이때 PSQL의 내부변수를 사용하여 해결하면된다.

 

\set [변수명] [변수 값]

ex )

\set 아이디 'id123'

delete from member where user = :아이디

 

 

 

5. 실행 시간 - 쿼리 하나하나 실행 시간 표시

\timing