https://edelivery.oracle.com
                                                                                                                                                                                                                                               

출처 : http://www.kimho.pe.kr
해당 내용은 시퀸스 쿼리를 참조하기 위해 올립니다. 흠..
"CREATE SEQUENCE MYSQ INCREMENT BY 1 START WITH 10000;"
-------------------------------------------------------
 
 
시퀀스라는 것은 자동 증가 칼럼을 만들 때 사용합니다.
 
예를 들어 사이트에 가입한 회원들에게 임의의 번호를 부여한다고 가정했을 때요...
 
일단 모든 회원은 서로 다른 회원번호를 가지고 있어야 합니다. 
 
그래야 회원들이 동명이인이든 뭐든간에  구분해서 관리할 수 있으니까요.
 
그런데 여러분이 직접 일일이 가입하는 회원마다 번호를 만들어서 부여할 수는 없는 노릇입니다.
 
만약 하루에 회원이 100명씩 가입한다면 
 
하루 내내 그 100명에게 중복되지 않은 회원번호를 찾아서 부여하는데 시간을 보낼 수는 없겠지요.
 
그래서 우리는 가입하는 회원마다 자동적으로 중복되지 않는 회원번호를 부여하도록 하기 위해
 
자동 증가 칼럼을 이용하는 것입니다.
 
무슨 말이냐면요...
 
만약 처음으로 회원이 한명 가입해서 그 회원에게 1이라는 회원번호가 부여되었다면,
 
그 다음으로 회원이 가입할 때는 가입과 동시에 저절로 2라는 번호가 부여되도록 하는 것입니다.
 
회원이 가입할 때마다 새로운 회원번호에는 기존 회원번호에서 증가된 값이 부여되도록 하면 
 
회원번호가 중복되는 일이 생기지 않겠지요.
 
그것을 오라클에서는 시퀀스(Sequence)라는 것을 이용하여 구현하지요.
 
mySQL에서는 이와 같은 기능으로 auto_increment 속성이라는 것이 있습니다. 
 
얼마 전에 했던 게시판 만들기 강좌에서 사용되었었지요... 기억나시죠?
 
 
자, 이제부터 시퀀스를 사용해보도록 하겠습니다.
 
 
그럼 테스트를 위해 임의의 테이블을 만들겠습니다.
 
SQL> CREATE TABLE SQTEST
    2> (SQ_ID NUMBER,
    3> SQ_NAME VARCHAR2(20));
 
테이블 이름은 SQTEST이고 칼럼에는 SQ_ID와 SQ_NAME이 있습니다.
 
이제 할 일은 시퀀스를 만드는 것입니다.
 
SQL> CREATE SEQUENCE MYSQ INCREMENT BY 1 START WITH 10000;
 
CREATE SEQUENCE 라는 문장을 사용하여 MYSQ라는 이름의 시퀀스를 만들었습니다.
 
이제부터 우리는 MYSQ를 사용하여 SQ_ID를 자동 증가 칼럼으로 사용하게 될 것입니다.
 
이 문장에서 INCREMENT BY 1 은 자동 증가 칼럼의 증가치가 1이라는 뜻이구요,
 
START WITH 10000은 자동 증가 칼럼이 10000부터 증가한다는 뜻입니다.
 
그럼 이 시점에서 새로운 데이터를 입력해 볼까요? 잘 보세요.
 
SQL> INSERT INTO SQTEST VALUES(MYSQ.NEXTVAL,'홍길동');
 
데이터를 하나 입력했습니다. MYSQ.NEXTVAL이라는 데이터를 입력했죠?
 
우리는 시퀀스를 사용할 때 NEXTVAL이라는 슈도 칼럼(Pseudo-column)을 사용합니다. 
 
슈도 칼럼에 대한 얘기는 '오라클 rownum에 대하여'라는 강좌에서 잠깐 나왔었죠?
 
여기서는 그리 중요한 의미가 아니므로 그것에 대한 설명은 생락하겠습니다.
 
어쨌든 '시퀀스명.NEXTVAL'의 형태로 입력한다는 사실만 알아두시기 바랍니다.
 
그러면 현재 어떻게 값들이 입력되었는지 보도록 하겠습니다.
 
SQL> SELECT * FROM SQTEST;

SQ_ID

SQ_NAME

--------

--------------

10000

홍길동

 
SQ_ID에는 10000 이라는 값이 들어갔고 SQ_NAME에는 '홍길동'이라는 값이 들어갔습니다.
 
이해가 되시나요?
 
한번 더 INSERT를 실행하면 아마 좀 더 이해가 되실겁니다.
 
SQL> INSERT INTO SQTEST VALUES(MYSQ.NEXTVAL,'고길동');
 
다시 결과를 보면,

SQ_ID

SQ_NAME

--------

--------------

10000
10001

홍길동
고길동

 
SQ_ID에는 10000에서 1이 증가된 값인 10001이라는 값이 들어갔습니다.
 
이제 이해가 되시죠?
 
이런 식으로 계속 값을 넣다 보면 SQ_ID에는 언제나 서로 중복되지 않는 값이 들어가겠죠?
 
 
그런데 한가지 여러분께서 알아두셔야 할 사항이 있습니다.
 
SQ_ID에는 언제나 순차적인 값이 들어가는 것은 아니라는 것입니다.
 
무슨 말인지 모르시겠죠? 알 수가 없습니다. 제가 설명을 안했으니까요...
 
그럼 지금부터 자~알 보세요..
 
SQL> DELETE FROM SQTESET WHERE SQ_NAME='고길동';
 
이렇게 SQ_NAME이 '고길동'인 로우를 지웠습니다.
 
그러면 SQTEST라는 테이블에는 '홍길동'만이 들어있겠지요? 이렇게요..

SQ_ID

SQ_NAME

--------

--------------

10000

홍길동

 
그리고 여기서 다시 새로운 데이터를 하나 넣겠습니다.
 
SQL> INSERT INTO SQTEST VALUES(MYSQ.NEXTVAL,'홍제동');
 
'홍제동'이라는 새로운 데이터를 넣었습니다.
 
여기서 잠깐 퀴~~즈!
 
SQTEST 테이블에는 이제 어떤 값들이 들어가 있을까요?
 
너무 쉽다구요..?
 
그러면 과연 여러분께서 예상했던 결과가 나오는지 확인해 보겠습니다.
 
SQL> SELECT * FROM SQTEST;

SQ_ID

SQ_NAME

--------

--------------

10000
10002

홍길동
홍제동

 
보셨습니까?
 
SQ_ID에 10001이 아니라 10002가 들어가 있습니다. 이상하죠?
 
음...  왜 이런 결과가 나왔느냐 하면, 
 
시퀀스는 그 특성상 일단 한번 증가하면 그 값이 절대 다시 줄어들지는 않습니다.
 
이 녀석은 오로지 증가밖에 할 줄 모르는 녀석이지요. 무대포에요..
 
"난 한 놈만 패!"  뭐 이런 거죠...
 
따라서 이전에 10001이라는 값이 한번 생겼었다면 10001이 지워져도,
 
그 다음엔 무조건 10002라는 값을 만드는 것입니다.
 
그러므로 여러분은 DELETE로 데이터를 하나 지웠다고해서
 
다른 시퀀스 값이 저절로 하나씩 감소해서 그 값을 채우지는 않는다는 것을 알아두시기 바랍니다.
 
아시겠죠?

시퀀스란

1) 오라클에서 자동으로 증가되는 숫자를 만들어주는 객체이다.

2) 유일(unique)한 값을 생성해 주는 오라클의 객체이다.

3) 시퀀스를 생성하면 기본키와 같이 순차적으로 증가하는 컬럼을 자동적으로 생성할 수 있다.

4) 보통 primary key 값으로 지정하여 사용한다(유일무이)

5) 일반적으로 sequence는 테이블과는 독립적으로 생성되어, 하나의 sequence를 여러 테이블에서 사용할 수 있다.

1. 생성방법

CREATE SEQUENCE [시퀀스명]

START WITH [시작 숫자] INCREMENT BY [증가되는 숫자]

MAXVALUE [N] | NOMAXVALUE

MINVALUE [N] | NOMINVALUE

CYCLE | NOCYCLE

1) start with : 시퀀스의 시작값을 지정한다. 값을 지정 하면 그 값을 시작으로 순차적으로 증가한다

2) increment by : 시퀀스를 얼마씩 증가 시킬 건지 정하는 부분이다. ex) 2라고 지정하면 2씩 증가한다.

3) maxvalue n | nomaxvalue

- maxvalue n : 시퀀스가 증가 할 수 있는 최대값을 말한다.

- nomaxvalue : 시퀀스의 값을 무한대로 지정한다.


4) minvalue n | nominvalue

- minvalue n : 시퀀스의 최소값을 지정한다. 기본값은 1이다.

- nominvalue를 지정할 경우 최소값은 무한대가 된다.

5) cycle : 최대값이 넘으면 다시 처음으로 돌아가 순환한다

2. 시퀀스 옵션

1) 현재 사용 되고 있는 모든 시퀀스의 이름을 조회 해 보자

SELECT* FROM USER_SEQUENCES

2) 하나의 시퀀스의 값을 반환하는 방법은 다음과 같다

CURRVAL : 현재 값을 반환 합니다.
NEXTVAL : 현재 시퀀스값의 다음 값을 반환 합니다.

ex) SELECT temp_seq.CURRVAL FROM DUAL

SELECT temp_seq.NEXTVAL FROM DUAL

3) 사용규칙


** NEXTVAL, CURRVAL을 사용할 수 있는 경우
- subquery가 아닌 select문
- insert문의 select절
- insert문의 value절
- update문의 set절


** NEXTVAL, CURRVAL을 사용할 수 없는 경우
- view의 select절
- distinct 키워드가 있는 select문
- group by, having, order by절이 있는 select문
- select, delete, update의 subquery
- create table, alter table 명령의 default값

3. 시퀀스의 수정
ALTER SEQUENCE [시퀀스 이름]
INCREMENT BY [N]
MAXVALUE [N] | NOMAXVALUE
MINVALUE [N] | NOMINVALUE
CYCLE | NOCYCLE
START WITH는 수정할수 없습니다.
4. 시퀀스의 삭제
DROP SEQUENCE temp_seq;
3. 예제
1) 시작 값이 1이고 1씩 증가하며, 최대값이 1000 이 되는 시퀀스를 생성해 보자
create sequence temp_seq
start with 1
increment by 1
maxvalue 1000
2) 임시의 테이블에 insert를 할때 사용 방법
INSERT INTO emp(empno, ename, hiredate ) VALUES(temp_seq.NEXTVAL, 'test', sysdate);
USB 부팅 카테고리 없음 2011. 8. 11. 16:50