블로그 이미지
잡초 개발자의 좌충우돌 이야기 yysvip

카테고리

분류 전체보기 (211)
Java Programing (24)
Web Programing (20)
Database (36)
Tool (46)
까칠한 IT (27)
까칠한 정보 (42)
까칠한 Strory (16)
까칠한 Project (0)
Total1,164,722
Today124
Yesterday4,565

달력

« » 2018.12
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

공지사항

Oracle 자동증분 Sequence와 max(seq)+1의 차이

  까칠한 남자 Strory       yysvip.tistory.com       잡초 개발자 까찰한 쑤의 좌충우돌 개발 이야기

 

 

데이터베이스 테이블의 숫자로 된 unique key컬럼의 경우 유일한 고유번호를 자동으로 부여할 때 Sequence를 생성하여 사용하거나 Max(seq)+1을 사용하여 자동증분 하게 한다.

 

 프로젝트를 진행하면서 Sequence 보다는 Max값을 구해 사용하는 경우가 다수이지만 둘의 차이를 이해하고 사용한적은 없었다.

 

Max를 사용할 경우 Sequence처럼 Object를 생성하는 번거로움을 줄일 수 있어 보다 편하고 빠르게 진행이 가능하나,

Max(no)를 찾기위해 table에 full scan을 해야하고 insert into시 다른 session에 의해 중복값이 등록될 수 있는 위험이 높아  Sequence 사용을 권장을 한다고 한다. 

 

 시퀀스는 생성의 번거로움이 있고, 채번 번호에 중간 중간 번호가 빠질 수 있으며, 빈번한 생성으로 인하여 관리가 다소 어려울 수 있으나, 분명 각각의 장.단점들이 있기에 용도 및 상황에 사용하면 될듯하다.

 

 

 

시퀀스(Sequence)의 이해 및 활용

 

 

시퀀스란?

- 유일(UNIQUE)한 값을 생성해주는 오라클 객체이다.
- 시퀀스를 생성하면 기본키와 같이 순차적으로 증가하는 컬럼을 자동적으로 생성 할 수 있다.
- 보통 PRIMARY KEY 값을 생성하기 위해 사용 한다.
- 메모리에 Cache되었을 때 시퀀스값의 액세스 효율이 증가 한다.
- 시퀀스는 테이블과는 독립적으로 저장되고 생성된다.

 

 

시퀀스 생성

-- 시퀀스 생성 Syntax CREATE SEQUENCE sequence_name [START WITH n] [INCREMENT BY n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE] [CACHE | NOCACHE]

 

- START WITH : 시퀀스의 시작 값을 지정한다. n을 1로 지정하면 1부터 순차적으로 시퀀스번호가 증가 한다.
- INCREMENT BY : 시퀀스의 증가 값을 지정한다. n을 2로 하면 2씩 증가한다. START WITH를 1로, INCREMENT BY를 2로 설정하면 1, 3, 5, 7,.. 이렇게 시퀀스 번호가 증가한다.
- MAXVALUE : 시퀀스 최대값
- MINVALUE : 시퀀스 최소값
- CYCLE|NOCYCLE : 최대값 도달시 순환 여부
- CACHE | NOCACHE : CACHE 여부, 원하는 숫자만큼 미리 만들어 Shared Pool의 Library Cache에 상주시킨다.

 

 

시퀀스 수정

 

START WITH 값을 제외하고 ALTER SEQUENCE 명령어로 수정 할 수 있다.

 

-- 시퀀스 수정 Syntax
ALTER SEQUENCE sequence_name
    [INCREMENT BY n]
    [MAXVALUE n | NOMAXVALUE]
    [MINVALUE n | NOMINVALUE]
    [CYCLE | NOCYCLE]
    [CACHE | NOCACHE]

 

 

시퀀스의 사용예

 

시퀀스 생성

empno를 자동 증가하는 시퀀스를 만들어 보자

 

-- 8000부터 시작하는 시퀀스를 생성하자
CREATE SEQUENCE  seq_empno
 START WITH  8000
INCREMENT BY 1
 CACHE 20;
 
 
-- 시퀀스가 정상적으로 생성되었는지 조회해 보자
SELECT seq_empno.NEXTVAL FROM DUAL;
SELECT seq_empno.NEXTVAL FROM DUAL;
SELECT seq_empno.CURRVAL FROM DUAL;

 

시퀀스를 이용해서 데이터를 등록해 보자

 

-- INSERT 시 시퀀스 사용
INSERT INTO emp 
        (empno, 
         ename, job, mgr, 
         hiredate, sal, comm, deptno)
VALUES
        (seq_empno.NEXTVAL, 
         'TIGER', 'MANAGER', 7839, 
         SYSDATE, 3000, null, 20);
 
 
-- SELECT 절에서 시퀀스 사용
CREATE TABLE emp2
AS
SELECT seq_empno.NEXTVAL as empno, ename, 
       job, mgr, hiredate, sal, comm, deptno
FROM emp; 
 
 
-- 시퀀스가 정상적으로 반영되었는지 조회해 보자
SELECT * FROM emp;

 

시퀀스 수정

시퀀스 수정 예이다.

 

-- seq_empno  시퀀스의 증과값과 Cache 사이즈를 변경하는 예이다.
ALTER SEQUENCE  seq_empno
INCREMENT BY 10
CACHE 40;
 
 
-- 시퀀스가 정상적으로 변경되었는지 조회해 보자
SELECT seq_empno.NEXTVAL FROM DUAL;
SELECT seq_empno.NEXTVAL FROM DUAL;
SELECT seq_empno.NEXTVAL FROM DUAL;
SELECT seq_empno.CURRVAL FROM DUAL;

 

시퀀스 삭제

DROP SEQUENCE 명령으로 시퀀스를 삭제 할 수 있다.

 

-- seq_empno 시퀀스를 삭제한다.
DROP SEQUENCE seq_empno;


문서에 대하여
- 강좌 URL : http://www.oracleclub.com/lecture/1037
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 오라클클럽의 모든 강좌는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.

 

Posted by yysvip

최근에 달린 댓글

최근에 받은 트랙백

글 보관함