2011-05-02 5 views
0

에 고유 제약 조건 오류를 잡는 방법 : 이미 존재하는 이름을 가진 항목을 입력하려고하면 어떤 일이 일어날 것이라고어떻게 고유 한 contraint있는 테이블을 작성하는 경우, 예를 들어, POSTGRESQL

CREATE TABLE distributors (
    did  integer, 
    name varchar(40) UNIQUE 
); 

. 나는 그렇게하려고 시도했다. 그리고 그것은 단지 어떤 에러 메시지도 표시하지 않고 종료했다. 새 항목이 실제로 삽입되었는지 여부를 확인하는 방법이 있습니까?

ERROR: duplicate key value violates unique constraint "distributors_name_key" 
DETAIL: Key (name)=(aaa) already exists. 

을 기록 삽입되지 않습니다 : 이미 존재하는 이름을 가진 레코드를 삽입하려고하면

+0

데이터가 삽입되지 않습니다. db에서 오류가 어떻게 해석 되는가에 따라 액세스 할 수있는 사용자가 무엇입니까? libpq/odbc 등? –

+0

libpq를 사용하고 있는데, 그게 무엇을 반환할까요? – error

+0

PQExec의 결과를 PQresultStatus로 확인하십시오. http://www.postgresql.org/docs/8.0/static/libpq-exec.html –

답변

0

,이 같은 오류 메시지가 표시됩니다.
allplcation 수준에서 수행하는 경우 이와 비슷한 메시지와 함께 예외가 throw됩니다. 프로그래머는이 예외를 처리하는 방법에 달려있다.

ID 필드가 자동 생성 (SERIAL 또는 BIGSERIAL)되어 있고 이름 만 입력하면 이미있는 이름을 삽입하면 레코드를 삽입하지 않은 경우에도 ID 시퀀스가 ​​1 씩 증가합니다.

INSERT를 확인하기 전에 "SELECT"쿼리를 수행하지 않으려면 레코드가 이미 존재해야합니다. 자세한 내용은 확실히에 - 삽입이 오류 코드 어딘가에 설정 사용중인 인터페이스의 몇 가지 방법으로 읽을 수있을 것보다 실패하면

BEGIN TRANSACTION; 
int records = SELECT name FROM table WHERE name = 'aaa' FOR UPDATE; //FOR UPDATE to lock the row from being read by other user until transaction finishes. 
if (records == 0) 
    INSERT INTO table VALUES (1, 'aaa'); 
else 
    MessageBox.Show("Record already exists"); 
COMMIT TRANSACCTION; 
+0

@ mj82 : 위의 코드는 경우에 따라 고유 한 위반 사항을 반환하기도합니다. –

+0

@depesz : 어떤 상황에서 발생할 수 있는지 정확히 알 수 있습니까? – mj82

+0

@ mj83 : SELECT가 완료된 후 INSERT가 실행되기 전에 누군가가 행을 삽입하는 경우 –

2

: 의사 코드에서 하나의 트랜잭션의 모든 작업을 수행 할 수 액세스 라이브러리/모듈에 대한 설명서. 그것은 아무것도 반환하지 않은 경우

INSERT INTO distributors (did, name) values (...) RETURNING did; 

그리고 - 오류가 있음 :

또는 당신에 삽입을 변경할 수 있습니다.