2017-03-06 8 views
-1

최근에 내 클라이언트가 ORA-00001 : 고유 제약 조건 위반 오류를 발견 한 사례를 받았습니다. 이것은 프로그램이 두 개의 테이블을 잘라내어 데이터를 그 테이블에 삽입하려고 할 때 발생했습니다. 오류 로그 파일에서 이 자르는 단계는 는 빈 테이블에서 고유 제약 조건 위반.

하지만 바로이 후 INTERNET_ITEM

에서 삭제 INTERNET_GROUP 에서 삭제 완료되었으며, Internet_group 테이블에 삽입은 ORA-00001 오류를 유발. 이 오류와 관련된 데이터베이스 설정이 있는지 궁금합니다. 필자는 오라클을 전혀 사용하지 않았고 오라클이 SELECT 문을 사용하여 행에 잠금을 설정하는지 궁금해합니다.이 경우 행은 잠겨져 어떻게 든 삭제되지 않습니다. 어떤 도움을 주셔서 감사합니다.

+2

잘라 내기! = 삭제, 그러나 아마도 관련이 없습니다. 여러 개의 충돌 행을 삽입하려고 시도하지 않았습니까? 삽입하는 데이터는 기존 데이터와 비교할 때 고유 한 것이 아니라 당연히 고유해야합니다. 삭제가 롤백되지 않았 음을 확신합니다.이 문제가 발생한 후에 테이블의 데이터를 확인 했습니까? (당신은 부패한 인덱스 또는 다른 것이있을 수 있지만, 명백한 것을 먼저 배제하십시오) –

+1

재현 할 수있는 예제를 줄 수 있습니까? 또는 최소한 DDL/DML이 관련되어 있습니까? – tbone

+0

삭제가 COMMIT 되었습니까? – BobC

답변

0

잘라 내기와 삭제의 차이점을 알아 두시기 바랍니다. 테이블을 잘랐다 고했지만 "삭제"라고 말하면됩니다. 그것은 완전히 다른 것입니다. 당신은 당신이이 DDL (데이터 정의 언어) 문이 아닌 것으로 간주됩니다으로 커밋이 TRUNCATE 문을 필요가 없다는

truncate table internet_group reuse storage; 

마음에 당신을 대체하려고, 테이블을 비우시겠습니까 경우 업데이트 및 삭제와 같은 DML (데이터 수정 언어) 문.

또한 select에는 행 잠금이 없습니다. 그러나 변경 사항은 커밋 될 때 데이터베이스의 다른 세션에만 적용되고 표시됩니다. 나는 그것이 일어났다 고 생각한다. 레코드를 삭제했지만 커밋 (아직)을 실행하지 않았고 이후에 새 레코드를 삽입했습니다.

편집 : 이제 여러 레코드를 삽입하고있는 것 같습니다. 다른 옵션은 데이터 자체가 위반을 일으킬 수 있습니다. 테이블에 제약 조건을 입력 해 주시겠습니까? 기본 키 또는 고유 제한 조건이 있어야합니다. 당신은 당신의 데이터 세트에 대해 그것을 잡을 수 있습니다.