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
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 |