안녕하세요.
지금 c++를 이용해서 레코드를 DB로 copy하고 있습니다. 레코드를 넣으면서 순서대로 id가 증가하게 하고 싶은데, (id: serial) 어떻게 해야 할까요?
id란에 DEFAULT로 해봐도, nextval(..)를 이용해봐도 잘 되고 있지를 않습니다.
꼭 도움 부탁드립니다. 감사합니다.
입력 쿼리에서 테이블 (필드, 필드, ...)
에서 필드에서 제외하면 자동으로 들어가지 않나요?
copy 테이블 (필드, 필드, ...) from ...
어떻게 했는데 안 된다는 것인지 좀더 자세히 알려주시는 것이 적절한 도움을 받는데 필요할 것 같습니다.
밑에 글도 그렇고 답하기가 좀 애매하네요.
ID 컬럼을 어떻게 만들었는지
COPY 명령을 사용했다는 것인지 INSERT 문을 사용해서 데이터를 copy 한다는 것인지
INSERT 문을 사용했다면 어떻게 사용했다는 것인지
좀 난해하게 글을 작성해서 죄송합니다. 한글을 칠 수 없었던 상황이라 네이버를 통해서 옮겨 붙이기를 해서리..^^;;;
우선 테이블은 다음과 같습니다.
table name: A
fileds:
seq int, weight float, id serial
이제 테이블에 데이터를 넣는 단계입니다. c++에서 작업하고 있는데, 우선 넣고 싶은 데이터를 임시 저장하는 버퍼가 있고, 이 버퍼가 다 차면
PQputCopyData(m_conn, copyCommand, strlen(copycommand));
PQputCopyEnd(m_conn, NULL);
//m_conn: DB connection object
//copyCommand: string으로 되어있는 버퍼입니다.
위와 같은 식으로 넘겨주게 됩니다. 예를 들어 넣고 싶은 레코드가 2개가 있을시, copyCommand에는
넣고싶은 레코드 -> (1,3.4), (4,2.1) //id fields는 serial이니깐 우선 제외했습니다.
copyCommand = "1\t3.4\n4\t2.1\n"
이런식으로 들어가 있습니다. 그런데 위에 것을 실행했더니 레코드가 하나도 들어가지지 않아서
copyCommand = "1\t3.4\tDEFAULT\n4\t2.1\tDEFAULT\n"
이렇게 바꾸어도 안되고
copyCommand = "1\t3.4\tnextval('heap_id_seq')\n4\t2.1\tnextval('heap_id_seq')\n"
이렇게 해도 들어가지 않는 상태입니다.
고수 님들의 도움 부탁드립니다.
테이블에 ID 컬럼이 없을 때에는 문제없이 등록이 되나요?
첫 번째 방법 (ID 컬럼을 COPY 데이터에 포함하지 않는 방법)으로 했을 때에 처리되어야 할 것 같은데요.
왠지 serial의 문제가 아닌 COPY command의 문제 아닐까 생각이 듭니다.
PQputCopyEnd을 호출할 때에 null을 보내지 말고 error message를 얻어보시면 뭐가 나오지 않을까요?
제가 libpg의 copy 명령을 써본 적이 없고 지금 그것을 테스트해볼 환경이 안되네요.
table name: A fileds: id serial, seq int, weight float ----------------------------------------------------- char Query[512]={0,} sprintf( Query , "COPY A( seq , weight ) FROM STDIN;" ); PGresult *res = PQexec( m_pqconn , Query); if( PQresultStatus(res) != PGRES_COPY_IN ) { fprintf( stderr , "Error : %s" ,PQerrorMessage( m_pqconn ) ); return -1; } PQclear( res ); char Buffer[1024]={0,}; sprintf( Buffer , "1\t1.2\n2\t2.2\n3\t3.2\n" ); PQputCopyData( m_pqconn , Buffer , strlen( Buffer ) ) ); PQputCopyData( m_pqconn , "\\.\n" , strlen( "\\.\n" ) ) ); char* strErrorMessage; PQputCopyEnd( m_pqconn , strErrorMessage ); if( strErrorMessage != NULL ) { fprintf( stderr , strErrorMessage ); return -1; } res = PQgetResult( m_pqconn );
if(PQresultStatus(res) != PGRES_COMMAND_OK || PQresultStatus(res) != PGRES_TUPLES_OK ) { fprintf( stderr , PQerrorMessage( m_pqconn ) ); } PQclear( res );
------------------------------------------------ 수정할수록 ~.~;;; 대네요 ㅜ.ㅜ;
메뉴얼에는 \. <-- 요게 없어도 상관없다는 말이 있긴 한데.. >.< http://www.postgresql.org/docs/current/interactive/libpq-copy.html