MSSQL

idx_ 비어있는 번호찾아 자동증가하기

이빛나리 2011. 3. 14. 18:13


게시판의 글번호를 자동증가하면, 중간에 게시글이 삭제되었을 경우 문제가 될 수 있다.
1.2.3.4.5 의 글 중에서 3번글이 삭제되어도 자동증가는 3번이 아닌 6번으로 번호를 부여한다.
그런문제를 해결하기위해 비어있는 번호를 채워주며 번호를 부여하는 함수를 만들어보자.
 
함수명▶ FUNC_IDX_Board()

if(not exists(select * from Board))-- 게시글이 존재하지 않는다면
 set @idx = 1
else
begin
 select @minIdx = min(idx) from Board-- Board의 idx 중 가장 작은 수를  @minIdx로!
 
 if(@minIdx > 1)
  set @idx = 1
 else
 begin
  select @maxIdx = max(idx) from Board-- Board의 idx 중 가장 큰 수를  @maxIdx로!

  select top 1 @newIdx = rn
  from (select idx, (ROW_NUMBER() OVER (Order by idx) + @minIdx) - 1 as rn
  from BasicBoard)tt-- 테이블 tt
  where idx <> rn

  if(@newIdx is not null)
   set @idx = @newIdx
  else
   set @idx = @maxIdx + 1
 end
end

return @idx

 
                   
 where idx <> rn
- rn는 idx를 기준으로  번호증가. idx와 rn이 같지않다는 것은 중간에 글이 삭제됐다는 의미다.

select top 1 @newIdx = rn
from (select idx, (ROW_NUMBER() OVER (Order by idx) + @minIdx) - 1 as rn
from BasicBoard)tt
- idx와 rn이 맞지않는 테이블 목록(tt)에서 top1을 변수 @newIdx 에 넣는다.

if(@newIdx is not null)
set @idx = @newIdx

- @newIdx변수에 값이 있다면 ▶ 글번호 @idx는 @newIdx  

else
set @idx = @maxIdx + 1
- @newIdx변수에 값이 없다면 ▶ 글번호 @idx는 @maxIdx + 1