2013-07-23 2 views
2

PostgreSQL에 대한 새로운 기능입니다. 실제로 나는 이전에 MySQL을 사용하고 있었지만 postgreSQL을 사용하고 POC를 수행해야하는 특정 프로젝트의 특별한 이유 때문에.PostgreSQL COPY FROM 명령을 사용하는 MySQL LOAD DATA INFILE

이제 문제는 다음과 같습니다. 파일 내용을 데이터베이스 테이블로로드하기 위해 MySQL LOAD DATA INFILE 명령을 사용하고있었습니다.

내 테이블 구조는 다음과 같습니다 테이블 이름 : MSISDN 테이블 열 이름 : ID (기본 키 - auto_generated), JOB_ID, MSISDN, 지역, 상태

하지만 내 입력 텍스트 파일 (rawBase.txt)이 필요하다 아래 열만 : MSISDN, REGION

그래서 위의 2 열을 초기 JOB_ID 및 STATUS로로드하려면 아래 명령을 사용했습니다.

LOAD DATA INFILE 'D:\\project\\rawBase.txt' INTO TABLE MSISDN 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
(MSISDN,REGION) 
SET JOB_ID = 'XYZ1374147779999', STATUS = 0; 

당신은 내가 입력 텍스트 파일에 (JOB_ID와 STATUS)하지 않는 열에 대해 특정 초기 값을 설정할 수 있습니다 LOAD 데이터 INFILE 명령에서 사용할 수있는 옵션이 있다는 것을 볼 수

. PostgreSQL을의 경우 NOW

,

, 나는 같은 일이 일어날하고자합니다.

이 명령을 사용할 수 COPY의 같은 종류는 아래와 같이 로부터도 : (JOB_ID와 STATUS)

COPY MSISDN FROM 'D:\\project\\rawBase.txt' WITH DELIMITER AS ',' 

하지만 존재하지 않는 나머지 컬럼에 대한 특정 초기 값을 설정할 수 없습니다입니다 내 입력 텍스트 파일에. 나는 이것을하기의 유익한보기를 얻고 있지 않다.

가능한 경우 몇 가지 제안을하십시오.

감사합니다, 샌디 열 목록에

+1

임시 테이블에 데이터를로드하고 임시 테이블에서 'INSERT ... SELECT ...'를 사용하여 실제 테이블로 복사 할 수 있습니까? –

+0

lgor .. 덧글 주셔서 감사하지만 파일 복사본은 매우 큰 레코드입니다 따라서 임시 테이블을 사용하여 시간이 많이 소요되는 작업이 될 것입니다. – Sandy

답변

2

COPY, 당신은 지정하지 않은 테이블 컬럼에 DEFAULT을 설정합니다.

regress=> CREATE TABLE copydemo(a text not null, b text not null default 'blah'); 

regres=> \COPY copydemo(a) FROM stdin 
Enter data to be copied followed by a newline. 
End with a backslash and a period on a line by itself. 
>> blah 
>> otherblah 
>> \. 
regres=> SELECT * FROM copydemo; 
    a  | b 
-----------+------ 
blah  | blah 
otherblah | blah 
(2 rows) 

아마 당신은 stdin이 아닌 파일에서 COPY입니다. 나는 방금 내가 의미하는 것을 간략하게 데모하기 위해 stdin에서 그것을했다. 중요한 점은 CSV가 아닌 값을 필요로하는 열은입니다. COPY에 열 목록을 지정합니다 (예 : COPY (col1, col2)).

불행히도 COPY-specific SET에 해당하는 것이 없습니다. 임시 테이블을 통해 무대에 올리고 ALTER 테이블에 을 설정할 수 없거나 원하지 않는 경우 Igor이 제안한대로 INSERT INTO ... SELECT을 수행 할 수 있습니다.

+0

Craig .. 코멘트 주셔서 감사하지만, 기본값은 나를 위해 작동하지 않습니다. job_id의 초기 값은 파일 복사마다 다릅니다. – Sandy

+0

@Sandy In Postgres의 'ALTER TABLE' 문은 트랜잭션입니다. 모든 가져 오기 작업에 대해 트랜잭션 시작시이를 설정할 수 있으며 서로 간섭하지 않습니다. 트랜잭션이 끝나면 이전 기본값으로 되돌립니다. –

+0

@IgorRomanchenko 반값입니다. 'ALTER TABLE'은 트랜젝션이지만, 동시 읽기와 쓰기를 막는 테이블 *에 대한'ACCESS EXCLUSIVE' 잠금을 취합니다. 따라서 롤백 할 수는 있지만 여전히 파괴적입니다. 이 경우 가장 좋은 방법은 제안 된 단계를 임시 테이블에 따라 수행 한 다음 위에서 설명한대로 INSERT INTO ... SELECT를 수행하는 것입니다. –

2

당신은 "유닉스 방법"을 사용하여 파이프 그것을 할 수 있습니다

cat rawbase.txt | awk '{print $0",XYZ1374147779999,0"}' | psql -d dbname -c "copy MSISDN FROM stdin with delimiter AS ','" 
당신이 MS-Windows를 사용하는 나타나는 문제의 파일 경로에서 이제

하지만 유닉스 쉘 및 명령 줄 도구 awkMSYS 또는 Cygwin을 통해 Windows에서 사용할 수 있습니다.