2014-02-12 1 views
0

시퀀스 및 트리거를 사용하여 Oracle 내 테이블에서 자동 증가를 구현했습니다. 처음 두 개의 레코드가 연속 된 순서로 ID를 가졌지 만 세 번째 레코드의 항목에는 갭이있었습니다. ID는 8이었습니다. 레코드를 삭제하고 새 레코드를 입력 할 때 ID는 9가되었습니다. 어떻게 갭을 제거하고 3 번째 레코드의 ID를 3으로하고 다음에 대해 연속 된 순서로 얻습니까? 행을 삭제하면 새 행이 새 시퀀스로 시작하거나 삭제 된 시퀀스에서 계속 진행됩니까? 이 문제를 어떻게 해결합니까? 도와주세요ID 용 Oracle10g의 자동 증가에서 행이 삭제되면 새 행이 새 시퀀스로 시작하거나 삭제 된 시퀀스에서 계속됩니다.

답변

2

시퀀스의 간격은 결코 재사용되지 않습니다. 어쨌든 캐싱, 롤백, RAC 등으로 인해 삭제하지 않고도 갭을 예상해야합니다. RAC를 사용하는 경우 기대하는 순서대로 시퀀스를 얻지 못할 수도 있습니다. ID, 특히 '자동 증가'ID는 일반적으로 합성 기본 키이며 키의 실제 값은 본질적인 의미가 없으며 고유해야합니다.

Tom Kyte has a view on this subject 물론.

간격을 다시 사용하면 ID가 1, 2 및 3 인 레코드 세 개를 추가 한 다음 레코드 2를 삭제하면 어떻게됩니까? 다음에 삽입 된 레코드가 ID 2 또는 4를 얻습니까? 격차를 메우고 (시퀀스를 무시하고 시퀀스를 기본적으로 무시하는 경우라도) ID가 삽입 된 순서대로 있지 않으므로 ID를보고도 식별 할 수 없습니다. ID에서 삽입 된 순서를 알지 못합니다.

당신이 정말로 표시 목적으로 원활한 번호를 원하는 경우에 당신은 ID 값을 무시할 수와 의사 열 사용 : 당신은 그들이 다음 삽입 된 타임 스탬프 필드를 추가하고 설정 한 주문을 추적해야하는 경우

select t.column1, t.column2, ..., 
    row_number() over (order by t.id) as rn 
from your_table t; 

을 당신의 방아쇠에 또한 sys_timestamp에. 다음 순서로 연속 번호를 생성 할 수 있습니다.

select t.column1, t.column2, ..., 
    row_number() over (order by t.inserted) as rn 
from your_table t; 
관련 문제