Oracle SQL 강좌
시퀀스(Sequence)의 이해 및 활용 25 27 99,999+

by 김정식 SEQUENCE 시퀀스 INCREMENT BY NEXTVAL CURRVAL CREATE SEQUENCE DROP SEQUENCE MAXVALUE MINVALUE [2002.01.20]


시퀀스란?

  • - 유일(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.gurubee.net/lecture/1037

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 김정식 [2005.01.12 08:41:11]
- Oracle 9i Sequence Description

CREATE SEQUENCE [schema .] sequence
[{ { INCREMENT BY | START WITH } integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
}
[ { INCREMENT BY | START WITH } integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
]...
]
;

by smile [2005.11.09 20:33:43]
퍼갑니다. ^^

by min [2005.12.01 08:55:34]
그룹별로 시퀀스 할려고 하는데요~
그거는 어떻게 해야할까요??
부서별로 A,B,C가 있으면
A도 1부터 시작하고 B도 1부터 C도 1부터 시퀀스할려고 하는데..
가르쳐 주세요..^^
감사합니다.

by AmadeusM [2006.03.20 16:53:57]
CREATE SEQUENCE seq_a;
CREATE SEQUENCE seq_b;
CREATE SEQUENCE seq_c;

요렇게 시퀀스 3개를 만들고...
필요한 컬럼에 하나씩 쓰면 되지 않을까요...?

A 그룹에 쓸땐... seq_a.NEXTVAL
B 그룹에 쓸땐... seq_b.NEXTVAL
C 그룹에 쓸땐... seq_c.NEXTVAL

그런 의미... 아닌가요...? ^^;

by 변원상 [2006.10.12 17:37:56]
sequence 사용하면 데이타베이스 지져분해집니다.
걍 Application 프로그램에서 해야할 역할입니다.

by 굄돌 [2006.11.13 17:28:40]
sequence를 사용하지 않고 application에서 사용하면 동시 접근자에 관한 처리를 해줘야 하지 않나요?
훔.. sync를 맞춰서 하면 왠지 느려질것 같고... sequence가 좋을듯 한데..
저의 짧은 지식의 소견이었습니다 ^^;;

by 이현석 [2006.11.14 12:57:59]
채번을 하는 방법은 여러가지가 있습니다.
1.시퀀스를 사용,
2.가장 마지막 값에 +1
3.처번테이블 사용...

각각의 용도에 맞춰서 사용하시면 되는데 분명 장.단점들이 다 있습니다.
요 위에 변원상님 말씀처럼 시퀀스를 사용하게 되면 번호에 비빨이 빠지게 되니 지저분(?) 해 보이기도 하고, 채번테이블을 사용하면 lock부분을 잘 조절해야지요.
개인적으로 max+1을 추천합니다만 인덱스 desc을 사용하여 처리시간을 짧게 해주는 것이 key point입니다.

by 오라초보 [2006.12.11 17:53:19]
insert into pborder
values('?''gg','title','ocontent','password');
여기서 '?'가있는곳이 시퀀스인데요 꼭 입력해야 하나요
시퀀스명은요 pborder_gno 입니다 좀 알려주세요

by 오징어 [2006.12.13 16:46:53]
insert into pborder
values( pborder_gno.nextval ,'gg','title','ocontent','password');

sequence가 들어갈 쿼리문에 미리 이렇게 적어 놓으셔도 되구요..

아님..insert 하기 전에

select pborder_gno.nextval from dual; 해서 어디 가져와서 해도 됩니다.

그냥 쿼리에 미리 넣어 주시는게 편하겠죠?

by 이창현 [2006.12.23 09:59:26]
시퀀스의 사용목적에 대해 알고 싶습니다. (실제 db에서 어떻게 사용되는지요..)

by 이현석 [2006.12.26 09:36:11]
위에 제가 적어 놓았네요.
시퀀스의 사용목적은 채번을 위해서 사용합니다.
채번을 하는 방법은 몇가지가 있지만 각각 장단점은 있습니다.
그 중 시퀀스는 번호 중간중간이 떨어질 수 있는데 그 단점만 극복 할 수 있다면 성능면세서는 가장 좋다고 할 수 있겠습니다.

by 육영렬 [2007.02.11 15:33:21]
만들어 놓은 시퀀스를 조회하는 방법은 무엇인가요?

by bliss [2007.10.09 13:31:58]
select * from user_sequences 하시면 생성된 시퀀스들을 확인할 수 있습니다.

by 오라클 초짜 [2007.10.11 09:20:14]
시퀀스의 용도를 알기전에 Application 프로그래밍 레벨에서 max+1을 사용해서 채번을 했었는데요.
근데...시퀀스의 다른 용도가 있을거 같아서요. 문자를 조합해서 채번할 수있는 기능... 뭐.. 이런 것들이요.
ex) a0001, b0001, ..., a0002, b0002,...
정확한 예가 될지는 모르겠지만, pk를 문자와 숫자가 조합된 형태로 만들어야 할 것 같아서요...
채번을 할때... 꼭 숫자가 아니라... 알파벳을 섞어서 사용하는 방법이 있는지요?
아시는 분 답변 부탁드려용~~~^^;
(모든 글이 예전에 올린 글이라.. 답변이 달릴지..-_-;)

by 현 [2007.10.11 09:53:40]
오라클 초짜님. 답글을 달았었는데, 원글을 지워 버리셨군요.
시퀀스는 채번을 하기 위한 용도 이외에 다른 용도는 없습니다.
문자를 조합해서 사용하는 기능은 제가 알려드린 방법으로 하시면 되구요.
그리고, 답글이 달렸을땐 질문 원글을 안지웠으면 좋겠습니다.
달아논 답글이 제짝을 못찾고 헤베게 되잖아요...^^

by 오라클 초짜 [2007.10.11 10:50:35]
앗! '현'님죄송합니다~ 근데.. 제가 드린 질문을 좀 정리한다는 생각으로 다시 적었는데... 근데 분명히 제가 삭제할때는 답글이 분명없었는데요 ^^; 그래서 그냥 삭제하고 다시 적은건데...-_-;; 제가 삭제할때 쯤... 현님께서 답글을 달고 있었나보네요....;;
아무튼 죄송합니다. 근데... 답글도 못보고... 지워졌으니...^^;;

by 오라클 초짜 [2007.10.11 15:26:59]
현님~ 답글은 못본 상태에서 지워졌기땜에.. 현님께서 알려주신 방법은 못봤는데요..ㅜㅡ
그 방법이 뭔지 다시 알려주시면 안될까요??^^;

by 현 [2007.10.11 16:16:42]
일단 시퀀스가 문자를 증가시키는 기능은 없습니다만,
뜻이 있으면 길이 있다고 굳이 문자를 증가시지고자 한다면 다른 방법을 찾아보면 있겠죠.(그 부분은 시퀀스 챕터가 아니므로 패쓰~~)
문자와 시퀀스를 조합하시고 싶으시다면 ||를 사용하시면 됩니다.
즉, 'AAA'||to_char(emp_seq.NEXTVAL) 이런식으로 붙이시면 되구요,
혹시 자릿수가 일정해야 한다면 lpad, rpad 등을 사용해서 시퀀스의 자릿수를 일정하게 정해 주시면 됩니다.

by 오라클 초짜 [2007.10.11 16:36:03]
'현'님 정말 감사합니다~ 역시.. 뜻이 있는 곳에 길이 있군요 ^^
App 프로그래밍과 같이... 오라클 SQL도 역시.. 많이 해봐야 늘거라는 생각이 드네요..(경험의 중요성!)
아무튼 정말~ 감사드리구요. 이 사이트 역시 배울 것이 너무 많은 곳입니다!!

by 안돼 [2007.12.24 15:38:03]
자바 쿼리문에 values('"+seq.nextval+"') 여기서 ,seq에서 자구 에러나는데요
자바가 쿼리문을 인식을 못해서 그러는것 같아요... 어떻게 해결하죠??
자바에서 . 을 찍으면 객체를 말하는거자나요 그래서 그러는것같은데

by snibug [2007.12.27 11:33:06]
'"+"seq.nextval"+"'
이렇게 한번 처리해보시는건 어떨까요 ??ㅎㅇㅎ?

by 마루아빠 [2008.01.31 11:47:37]
매일 자정에 시퀀스의 값을 초기화 0으로 돌려야 하는데 시퀀스를 DROP하거나 ALTER를 써서 값을 바꾸는 방법까지는 알아보았는데 시퀀스를 DROP하거나 값을 변경하는 도중 다른 프로세스에서 SELECT가 들어오는 경우에는 문제가 될 것 같습니다. 혹시 시퀀스 값을 변경하는 과정중에는 시퀀스에 락을 걸수 있는 방업은 없을까요?

by 정혁진 [2008.09.23 15:34:36]
ORA-08002: sequence SQ.CURRVAL is not yet defined in this session
SQ.NEXTVAL은 사용 가능한데요,
SQ.CURRVAL은 이 세션에서 사용 할수 없다네요;;
왜 글쵸?

by 타락천사 [2008.09.23 16:49:05]
이유는 이거예요
==> 상기의 정확한 이유는 "새로쓴 대용량 데이터베이스 솔루션" P 433 설명에 의하면
만약 어떤 세션에서 NEXTVAL 을 하지 않은 채 CURRVAL 을 요구하게 되면 에러가
난다. 그것은 CURRVAL 은 바로 그 세션이 지금 현재 가지고 있는 최종 시퀸스 값을 의미
하므로 한번도 NEXTVAL 을 요구한 적이 없다면 보유하고 있는 CURRVAL 값이 없기
때문이다.

by 123 [2009.08.03 11:55:34]
SELECT SEQ_DATA_REQ.CURRVAL FROM DUAL; 은 안되는데
SELECT SEQ_DATA_REQ.NEXTVAL FROM DUAL; 은 되네요
안되는이유가 "ORA-08002: 시퀀스 SEQ_DATA_REQ.CURRVAL은 이 세션에서는 정의 되어 있지 않습니다" 라고 뜨는데 뭔지를 모르겠습니다.

by Z700zZz [2009.10.15 19:40:47]
123/ 그부분이라면 바로 위의 댓글에 답변이 달려있는데요..

by 양한마리 [2010.02.03 13:44:27]
감사합니다. ^ ^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입