게시판의 글번호를 자동증가하면, 중간에 게시글이 삭제되었을 경우 문제가 될 수 있다.
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 |
'MSSQL' 카테고리의 다른 글
SQL null 데이터 없애기 (0) | 2011.05.17 |
---|---|
CHARINDEX- 시작위치 반환 (0) | 2011.03.23 |
MSSQL 컬럼명 변경 (0) | 2011.02.22 |
where(조건)에서 case문 사용하기 (0) | 2011.01.28 |
다중 테이블(3개 테이블 join) (0) | 2011.01.14 |