앞서 포스팅한대로 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
'DB > RDBMS' 카테고리의 다른 글
[MSSQL] 저장 프로시저 생성 및 수정과 실행 (0) | 2020.04.27 |
---|---|
[MSSQL] CSV 파일 생성 및 문제 해결 방법 (0) | 2020.04.27 |
[PostgreSQL] COPY 사용 불가 (SQL Error 42501) (0) | 2020.04.27 |
[MSSQL] OPENQUERY 대용량 DML 작업 시 문제점 (0) | 2020.04.22 |
[MSSQL] OPENQUERY에 변수 사용 시 문제점 및 해결방법 (0) | 2020.04.14 |