oracle auto-increment 질문합니다. 0 5 1,396

by 김이수 [Oracle 기초] [2016.02.22 14:56:43]


게시판 테이블을 만들었습니다. 

INSERT INTO TB_BOARD
             (  
                 SEQ
              , TITLE
              , CONTENTS
              , HIT_CNT
              , DEL_YN
              , INS_DATE
              , INS_PERSON
              , UPD_DATE
              , UPD_PERSON
               
              )
        VALUES    (
        
                   SEQ.NEXTVAL
                 , #{title}
                 , #{contents}
                 , 1
                 , 'N'
                 , SYSDATE
                 , ''
                 , SYSDATE
                 , ''
                            
                )    

 

SEQ 가 1을 시작으로 AUTO-INCREMENT되도록 시퀀스를 생성하였는데...

게시글을 INSERT시키면 정상적으로 됩니다,

1부터~~~순차적으로 

그런데 임의로 3번을 지우면 SEQ가 하나씩 밀려나게 하고싶습니다. 

예를들어!

1 2 3 4 5 6 

1 2 3 4 5 <- 3을 삭제한 경우

1 2 4 5 6 < - 현재...

어떻게 하면 3을 삭제한 경우 처럼 SEQ를 바꿔줄 수 있나요??  

by swlee710 [2016.02.22 15:43:08]

트리거를 만들어서 insert 나 delete 시에 업데이트 하면 되지 않을까요?


by 겸댕2후니 [2016.02.22 15:48:25]

시퀀스는 현재값을 임의로 변경할 수 없기 때문에,

위 내용처럼, SEQ가 순차적으로 이뤄져야 되는 상황이라면,

SEQ컬럼을 선두로 하는 인덱스 생성하시고, 서브쿼리 + 트리거를 사용하셔야 될 것 같습니다.

1. 새로운 로우 삽입시 : SEQ = nvl(max(seq), 0) + 1

2. 중간 로우 삭제시 : update table set SEQ = SEQ-1 where old.SEQ < SEQ;


by 물뿌리개 [2016.02.22 15:56:13]

  INSERT 할 때, 일반SQL문으로는 밀리게 할 수없는 걸로 알고 있습니다. 


by 김이수 [2016.02.22 16:11:26]

답변 감사드립니다. 

남은 시간동안 답변을 토대로 해보겠습니다! 


by 마농 [2016.02.23 08:11:06]

키를 일괄 변경하는 것은 상당히 소모적이고 비효율적인 작업입니다.
키를 업데이트 하는것 보다는 키는 그대로 둔채 조회시 순번을 부여해 사용하길 권장합니다.
 

SELECT ROW_NUMBER() OVER(ORDER BY seq) rn
     , a.*
  FROM tb_board a
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입