게시판 같은 프로그램을 작성하다 보면...

게시글 각각의 고유번호를 생성하기 위해 몇가지 방법이 있다.

그중 많이 쓰이는몇가지 방법의 사용법과 특징을 살펴보자

게시판 테이블은 대략 이렇게 생겼다.

CREATE TABLE BOARD

(

BOARD_COND VARCHAR2(5) NOT NULL /*게시판 종류 */

BOARD_NO NUMBER NOT NULL, /* 게시판 번호 */

....

CONSTRAINT BOARD_PK PRIMARY KEY(BOARD_COND,BOARD_NO)

)

BOARD_COND 는 게시판의 종류로 자유게시판, 자료실, 질문 답변 같은 구분을 한다.

BOARD_NO는 각 게시판의 글번호로 각 게시판내에서만 유니크하면 된다.

즉 자유게시판에서는 1번글이 하나만 존재해야 하지만

자유게시판에 1번글이 있다고 자료실에 쓰는 글이 2번이 되면 안된다.

뭔말인지 이해했으리라 믿고...

위와 같은 구조에서

우선 가장 쉽게 접근 할 수 있는 방법으로

해당 게시판의 글번호중 가장 큰 글번호를 가져와서 +1을 하는 방법이 있다.

자유게시판의 BOARD_COND가 'FREE' 라고 가정하고 이것을 쿼리로 표현해 보면...

INSERT BOARD

(

BOARD_COND,

BOARD_NO,

...

)

VALUES

(

'FREE',

NVL(SELECT MAX(BOARD_NO) FROM BOARD WHERE BOARD_COND = 'FREE',0)+1,

)

이렇게 하면 될것 같다... 글이 저장되는 순간 가장 큰 글번호를 가져와서 1을 더해서 인서트 하면 된다.

(NVL을쓰는 이유는... 해당 글의 게시판에 글이 한개도 존재하지 않을 경우를 위해 사용한 것임)

특징은 다음에 이야기 하기로 하고

두번 째로 할 수 있는 방법은

오라클 SEQUENCE를 사용하는 방법이 있다.

게시판용 자동증가 SEQUENCE를 생성하고 그것을 사용하는 것이다.

만약 생성한 시퀀스가 BOARD_SEQ 라고 한다면...

아래와 같은 쿼리를 만들 수 있다.

INSERT BOARD

(

BOARD_COND,

BOARD_NO,

...

)

VALUES

(

'FREE',

BOARD_SEQ.NEXT_VAL,

...

)

간단해 보이지만간단한 만큼 귀찮은 작업이 필요하다.

우선 글번호를 게시판 종류별로 사용하고 싶다면...

시퀀스를 게시판 종류만큼 생성해야 한다.

또하나시퀀스의 특성상 어떤 조건을 만족하지 못해서 입력이 되지 않고롤백이 된경우에도

시퀀스는 증가한다는 것이다.

고로 게시물 번호에 이가빠질 가능성이 있다(게시물을 삭제해서 생기는 결번과는 다른...)

세번째 방법으로 힌트를 사용하는 방법이 있다.

1번에MAX(BOARD_NO)+1을 사용하는방법과 비슷하지만

그거 보다 좀더 효휼적인 방법으로 게시물이 늘어나도 속도에 대한 부담이적을 것이다.

INSERT BOARD

(

BOARD_COND,

BOARD_NO,

...

)

VALUES

(

'FREE',

NVL((SELECT /*+ INDEX_DESC(BOARD BOARD_PK) */

BOARD_NO

FROM BOARD

WHEREBOARD_COND = 'FREE'

AND ROWNUM = 1) ,0)+1)

...

)

간단하게 설명한다면

BOARD_COND,BOARD_NO로 구성된 PK 인덱스를 역으로 스켄하면서

BOARD_COND = 'FREE'인 데이터중 첫 ROW(ROWNUM = 1)을 선택한다.

이경우 데이터가 늘어날 경우 BOARD_COND에 인덱스가 걸려 있어야 좀더 빠른 검색이 될것이다.

'DataBase' 카테고리의 다른 글

[Oracle] ''&'' 입력하기  (0) 2008.02.19
[Toad] 에디팅시 () 부분이 반전 제거  (0) 2008.02.19
[Oracle] 자동증가 SEQUENCE 생성  (0) 2007.10.09
[Oracle] 테이블 생성 (다중 컬럼 PK)  (0) 2007.10.09
오라클 START/STOP  (0) 2007.08.11

+ Recent posts