database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 7457 게시물 읽기
No. 7457
대량의 레코드를 copy할때 자동으로 id(serial) 증가 방법?
작성자
help
작성일
2008-07-06 08:57
조회수
7,076

안녕하세요.

지금 c++를 이용해서 레코드를 DB로 copy하고 있습니다. 레코드를 넣으면서 순서대로 id가 증가하게 하고 싶은데, (id: serial) 어떻게 해야 할까요?

id란에 DEFAULT로 해봐도,
nextval(..)를 이용해봐도
잘 되고 있지를 않습니다.

꼭 도움 부탁드립니다.

감사합니다.

이 글에 대한 댓글이 총 7건 있습니다.

입력 쿼리에서 테이블 (필드, 필드, ...)

에서 필드에서 제외하면 자동으로 들어가지 않나요?

 

copy 테이블 (필드, 필드, ...) from ...

신기배(소타)님이 2008-07-06 14:23에 작성한 댓글입니다.

어떻게 했는데 안 된다는 것인지 좀더 자세히 알려주시는 것이 적절한 도움을 받는데 필요할 것 같습니다.


밑에 글도 그렇고 답하기가 좀 애매하네요.


ID 컬럼을 어떻게 만들었는지

COPY 명령을 사용했다는 것인지 INSERT 문을 사용해서 데이터를 copy 한다는 것인지

INSERT 문을 사용했다면 어떻게 사용했다는 것인지

박성철(gyumee)님이 2008-07-06 23:57에 작성한 댓글입니다.

좀 난해하게 글을 작성해서 죄송합니다. 한글을 칠 수 없었던 상황이라 네이버를 통해서 옮겨 붙이기를 해서리..^^;;;


우선 테이블은 다음과 같습니다. 

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"


이렇게 해도 들어가지 않는 상태입니다. 


고수 님들의 도움 부탁드립니다.



help님이 2008-07-07 00:24에 작성한 댓글입니다. Edit

테이블에 ID 컬럼이 없을 때에는 문제없이 등록이 되나요?

첫 번째 방법 (ID 컬럼을 COPY 데이터에 포함하지 않는 방법)으로 했을 때에 처리되어야 할 것 같은데요.

왠지 serial의 문제가 아닌 COPY command의 문제 아닐까 생각이 듭니다.

PQputCopyEnd을 호출할 때에 null을 보내지 말고 error message를 얻어보시면 뭐가 나오지 않을까요?

제가 libpg의 copy 명령을 써본 적이 없고 지금 그것을 테스트해볼 환경이 안되네요.

박성철(gyumee)님이 2008-07-07 01:02에 작성한 댓글입니다.
이 댓글은 2008-07-07 01:07에 마지막으로 수정되었습니다.

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 );

------------------------------------------------
수정할수록 ~.~;;; 대네요 ㅜ.ㅜ;


  

김석래님이 2008-07-07 14:20에 작성한 댓글입니다.
이 댓글은 2008-07-07 14:33에 마지막으로 수정되었습니다. Edit
PQputCopyData( m_pqconn , "\\.\n" , strlen(  "\\.\n" ) ) );

요것이 없어서 그랬던 것 일까요?
박성철(gyumee)님이 2008-07-07 14:28에 작성한 댓글입니다.

메뉴얼에는 \. <-- 요게 없어도 상관없다는 말이 있긴 한데..
>.<

http://www.postgresql.org/docs/current/interactive/libpq-copy.html

김석래님이 2008-07-07 14:35에 작성한 댓글입니다.
이 댓글은 2008-07-07 14:36에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
7461아이피 정렬은 어떻게.. [2]
Moon
2008-07-11
6957
7460컬럼 코멘트 가져오기 [3]
김주미
2008-07-08
7118
7459(VC++) Ado postgresql 사용법(문의) [2]
임지웅
2008-07-07
6533
7457대량의 레코드를 copy할때 자동으로 id(serial) 증가 방법? [7]
help
2008-07-06
7076
7456높은순서대로 record 삭제하는 방법? [6]
help
2008-07-06
6128
7455ADO POSTGRES ODBC 사용법 [2]
임지웅
2008-07-04
6642
7454솔라리스에서 createdb 오류...???? [1]
직한
2008-07-04
6443
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다