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 9227 게시물 읽기
No. 9227
duplicate key value violates unique constraint 에러 질문이요~~~
작성자
조민경
작성일
2013-02-01 17:18ⓒ
2013-02-01 18:21ⓜ
조회수
14,160

안녕하세요

 

php , postgres 로 개발중입니다.

 

데이터를 insert하는데요

 

확인해보면 데이터는 잘들어갔는데 다음과같은 에러가 납니다.

 

[unixODBC]Error while executing the query (non-fatal); ERROR:  duplicate key value violates unique constraint "table_messagelst_pkey"(01000)

 

pk 값이 중복되지않게 넣어줬구요,

 

디비툴에서 직접 쿼리문을 돌리면 정상적으로 들어가는데

 

프로그램으로 돌리면 데이터가 들어간후에 저런에러가 나네요

 

 인터넷을 아무리 뒤져봐도 답을 못찾겠네요,, 무엇이 문제일까요???ㅠㅜ

 

해당 테이블 스키마는 다음과같습니다. 

CREATE TABLE table_messagelst
(
  docid character varying(128) NOT NULL,
  msgid character varying(64) NOT NULL,
  caller character varying(128),
  callee character varying(128),
  msgorder integer DEFAULT NEXTVAL('table_messagelst_msgorder_seq'),
  ssid character varying(128),
  title character varying(512),
  msg text,
  type character varying(64),
  maketime timestamp(6) without time zone,
  CONSTRAINT table_messagelst_pkey PRIMARY KEY (docid , msgid )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE table_messagelst
  OWNER TO doc;

CREATE INDEX idx1_messagelst_msgorder
  ON table_messagelst
  USING btree
  (docid , msgorder );

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

 그런 문제는 주로 autocommit 기능이 off 되어있을 때 발생합니다. 

응용프로그램 쪽에서 실수로 insert 작업을 중복해서 하게 되어있는데, 

autocommit 이 off여서 두번째 기본키 중복 오류를 내면서 commit이 rollback 되는 경우죠.

 

응용프로그램 코드를 한 번 더 살펴보세요.

 

김상기(ioseph)님이 2013-02-04 11:03에 작성한 댓글입니다.

쿼리문 실행하는부분 바로전에 로그를 찍어봤지만  쿼리문은 한번만 실행이됩니다.ㅠㅜ

조민경님이 2013-02-05 12:25에 작성한 댓글입니다.
이 댓글은 2013-02-05 12:28에 마지막으로 수정되었습니다. Edit

postgresql.conf 파일에서 log_min_duration_statement = 0 으로 설정해서

DB 서버 쪽으로 오는 모든 쿼리문을 살펴보세요. 분명 두번 호출할 것 같네요.

 

김상기(ioseph)님이 2013-02-05 13:19에 작성한 댓글입니다.

확인해보았는데요 두번 insert되는게 맞네요. 

그런데 소스상에서 두번 호출을 해주진 않습니다.ㅠㅜ 

다음은 쿼리문 실행하는 함수입니다. 혹시 잘못된 부분이있는지 봐주세요.

아니면 혹시 php odbc 연동하는 곳에서 문제가 있을수도있나요?

 public function SqlExecDML($query) {
    $result = true ;
    if (!$this->SqlConnect()) return !$result ;
    $statement = odbc_prepare($this->connection, $query) ;
    if ($statement == FALSE) return !$result ;
    $result = odbc_execute($statement) ;
    return $result ;
 }

 protected function SqlConnect() {
    $result = true ;
    if (isset($this->connection)) {
        odbc_close($this->connection) ; 
    }
    $this->connection = odbc_connect($this->dsnString, "", "") ;
    if (!isset($this->connection)) $result = false ;
    return $result ;
 }

조민경님이 2013-02-05 17:54에 작성한 댓글입니다.
이 댓글은 2013-02-05 17:58에 마지막으로 수정되었습니다. Edit

증상을 찾았으니, 문제를 푸는 것은 직접.

응용 프로그램 디버깅입니다.

주변에 노련한 응용 프로그램 개발자들과 상의하거나, 문서를 참조해 가면서,

벌레잡기를 즐기세요. :)

잘 잡았으면 이곳에 그 노하우도 알려주시면 다른 분들이 도움을 많이 받을 것 같네요.

디버깅 작업을 하면서, 실력과 안목이 늘어가는 것 같더군요.

 

김상기(ioseph)님이 2013-02-06 14:58에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
9230트리거관련해서 궁금중이 생겼습니다.... [2]
김원진
2013-02-05
9136
9229다중행 서브쿼리 update 방법 [2]
효연
2013-02-04
9524
9228트리거 함수 작성하는데 막히는 부분이 있습니다. [1]
이기자
2013-02-01
8587
9227duplicate key value violates unique constraint 에러 질문이요~~~ [5]
조민경
2013-02-01
14160
9226db의 select 성능에 대한 질문 [2]
김대현
2013-02-01
9774
9225c언에서 postgresql 접속하는 소스 없을까요?? [2]
초보개발자
2013-01-29
8514
9222PostgresDBA.com 싸이트 오픈하였습니다.
PostgresDBA
2013-01-24
9977
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.053초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다