programing

삽입 중 고유 제약 조건 위반: 왜? (Oracle)

javamemo 2023. 6. 19. 21:05
반응형

삽입 중 고유 제약 조건 위반: 왜? (Oracle)

테이블에 새 행을 작성하려고 합니다.테이블에는 두 가지 제약 조건이 있습니다. 하나는 키 필드(DB_ID)에 있고 다른 하나는 값이 여러 필드 ENV 중 하나가 되도록 제약합니다.삽입할 때 삽입하려는 필드 중 하나로 키 필드를 포함하지 않지만 다음 오류가 발생합니다.

unique constraint (N390.PK_DB_ID) violated

오류의 원인이 되는 SQL은 다음과 같습니다.

insert into cmdb_db 
   (narrative_name, db_name, db_type, schema, node, env, server_id, state, path) 
values 
   ('Test Database', 'DB', 'TYPE', 'SCH', '', 'SB01', 381, 'TEST', '')

행을 수동으로 삽입한 경우 Oracle이 이미 사용 중인 DB_ID를 할당하려고 할 가능성이 있습니다.이 데이터베이스의 데이터가 프로덕션 데이터베이스에서 복원/이동되었지만, 어떻게 복원되었는지에 대한 자세한 내용은 알 수 없습니다.

무슨 생각 있어요?

아마도, 당신이 가치를 제공하지 않기 때문에.DB_ID테이블에 트리거를 삽입하기 전에 행 레벨로 값을 채우는 열입니다.그 트리거는 시퀀스에서 값을 선택하는 것으로 추정됩니다.

데이터가 프로덕션 데이터베이스에서 이동되었기 때문에(아마도 최근에) 데이터를 복사할 때 시퀀스도 수정되지 않았을 것입니다.시퀀스가 가장 큰 값보다 훨씬 낮은 값을 생성하고 있다고 생각합니다.DB_ID오류가 발생할 수 있습니다.

어떤 시퀀스가 사용되고 있는지 확인하기 위해 트리거를 보고 다음을 수행하여 이 의심을 확인할 수 있습니다.

SELECT <<sequence name>>.nextval
  FROM dual

그리고 그것을 비교합니다.

SELECT MAX(db_id)
  FROM cmdb_db

시퀀스가 데이터베이스에 이미 존재하는 값을 생성하는 경우, 시퀀스가 사용되지 않는 값을 생성할 때까지 시퀀스를 증분하거나 변경하여 다음 값을 설정할 수 있습니다.INCREMENT매우 큰 것으로, 다음 밸브를 한 번 얻고, 설정합니다.INCREMENT1로 되돌아갑니다.

오류가 DB에 이미 존재하는 기본 키를 복제하는 것처럼 보입니다.IDENTITY 키워드와 같은 것을 사용하여 SQL 코드를 수정하여 자체 기본 키를 구현해야 합니다.

CREATE TABLE [DB] (
    [DBId] bigint NOT NULL IDENTITY,
    ...

    CONSTRAINT [DB_PK] PRIMARY KEY ([DB] ASC),

); 

기본 키 필드 DB_ID에 대한 값을 제공하지 않는 것 같습니다.기본 키인 경우 해당 열에 고유한 값을 제공해야 합니다.이를 제공하지 않는 유일한 방법은 삽입 시 시퀀스에서 파생된 값을 제공하는 데이터베이스 트리거를 만드는 것입니다.

이것이 다른 데이터베이스에서 복원된 것이고 이 새 인스턴스에 시퀀스가 있는 경우 값을 재사용하려고 할 수 있습니다.이전 데이터의 키가 1 - 1000이고 현재 시퀀스가 500이면 이미 존재하는 값을 생성하는 것입니다.이 테이블에 시퀀스가 존재하고 이 테이블을 사용하려는 경우 테이블의 값을 시퀀스의 현재 값과 조정해야 합니다.

SEQUENCE_NAME.CURRVAL을 사용하여 시퀀스의 현재 값을 확인할 수 있습니다(물론 존재하는 경우).

언급URL : https://stackoverflow.com/questions/7571245/unique-constraint-violation-during-insert-why-oracle

반응형