CREATE SEQUENCE
CREATE SEQUENCE#
구문#
create_sequence ::=#
sequence_options ::=#
sync_table_clause ::=#
전제 조건#
SYS 사용자 또는 CREATE SEQUENCE 시스템 권한을 가진 사용자만이 이 구문으로 시퀀스를 생성할 수 있다. 만약 다른 사용자의 스키마에 시퀀스를 생성하려면, CREATE ANY SEQUENCE 권한을 가져야한다.
설명#
이 구문은 명시된 시퀀스 이름으로 새로운 시퀀스를 생성한다. 생성된 시퀀스는 시퀀스 번호를 자동으로 생성하는데 사용된다.
user_name#
생성될 시퀀스의 소유자 이름을 명시한다. 생략하면 Altibase는 현재 세션에 연결된 사용자의 스키마에 시퀀스를 생성한다.
seq_name#
생성될 시퀀스 이름을 명시한다. 시퀀스 이름은 "객체 이름 규칙"을 따라야 한다.
START WITH#
시퀀스의 시작값을 명시한다. 이는 MINVALUE와 MAXVALUE 사이의 값으로 지정 가능하다. 이 값이 생략되고 INCREMENT BY의 값이 0보다 크면, 기본값은 시퀀스의 최소값과 동일하다. 이 값이 생략되고 INCREMENT BY의 값이 0보다 작으면, 기본값은 시퀀스의 최대값과 동일하다.
INCREMENT BY#
시퀀스의 증감분을 명시한다. 기본값은 1이다. 이 값의 절대값은 MAXVALUE와 MINVALUE의 차이보다 작아야 한다.
MAXVALUE#
시퀀스의 최대값을 명시한다. 이는 -9223372036854775805부터 9223372036854775806까지의 범위내에서 지정 가능하다. 생략할 경우, INCREMENT BY의 값이 0보다 크면 기본값은 9223372036854775806이다. INCREMENT BY의 값이 0보다 작으면, 기본값은 -1이다.
NOMAXVALUE#
시퀀스의 최대값을 지정하지 않을때 사용된다.
MINVALUE#
시퀀스의 최소값을 명시한다. 이는 -9223372036854775806부터 9223372036854775805까지의 범위내에서 지정 가능하다. 생략할 경우, INCREMENT BY의 값이 0보다 크면 기본값은 1이다. INCREMENT BY의 값이 0보다 작으면, 기본값은 -9223372036854775806이다.
NOMINVALUE#
시퀀스의 최소값을 지정하지 않을때 사용된다.
CYCLE#
이는 시퀀스가 최대값 또는 최소값 한계에 도달했을 때 다음 시퀀스 값을 계속 생성할지 여부를 지정하는 옵션이다. 오름차순 시퀀스의 경우는 시퀀스의 다음 값은 최소값에서 다시 순환되고, 내림차순 시퀀스의 경우는 최대값부터 다시 순환된다.
NOCYCLE#
시퀀스의 순환을 허용하지 않을때 사용된다.
CACHE#
시퀀스 값을 더 빠르게 액세스 하기 위하여 명시된 개수 만큼의 시퀀스 값들이 메모리에 캐시된다. 캐시는 시퀀스가 처음 참조될 때 채워지며 다음 시퀀스 값을 요청할 때마다 캐시된 시퀀스에서 검색된다. 캐시된 마지막 시퀀스 값을 사용한 이후의 다음 시퀀스 값 요청시에 시퀀스 값들이 메모리에 캐시된다. 이 값을 생략하면 기본값은 20이다.
NOCACHE#
시퀀스를 메모리에 캐시하지 않는 경우 사용된다.
ENABLE | DISABLE SYNC TABLE#
시퀀스를 이중화하기 위한 시퀀스 이중화용 테이블을 생성할 것인지 여부를 지정한다.
ENABLE#
시퀀스 이중화용 테이블을 생성한다. 테이블의 이름은 [sequence 이름]$seq로 자동 부여된다.
DISABLE#
시퀀스 이중화용 테이블을 생성하지 않는다.
이 옵션을 명시하지 않으면 기본적으로 시퀀스 이중화용 테이블이 생성되지 않는다.
주의 사항#
- 새로 생성된 시퀀스에 대한 sequence_name.CURRVAL시도는 실패한다. sequence_name.CURRVAL로 새로 생성된 시퀀스에 접근하려면 먼저 sequence_name.NEXTVAL을 사용해야만 한다.
- 시퀀스 이름의 길이가 36 바이트 이하여야 시퀀스 이중화용 테이블을 생성할 수 있다.
예제#
다음 SQL문들을 이용하여 새로운 시퀀스를 정의하고 시퀀스 값과 정보를 확인해본다.
iSQL> CREATE TABLE seqtbl(i1 INTEGER);
Create success.
iSQL> CREATE OR REPLACE PROCEDURE proc1
AS
BEGIN
FOR i IN 1 .. 10 LOOP
INSERT INTO seqtbl VALUES(i);
END LOOP;
END;
/
Create success.
iSQL> EXEC proc1;
Execute success.
<질의> 다음 SQL문을 이용하여 시퀀스 객체로부터 정보를 확인한다.
iSQL> select * from v$seq;
이 구문은 생성되어 있는 모든 시퀀스 객체에 대한 정보를 읽어 들인다. Select * from seq와 달리 다른 사용자의 시퀀스 정보도 확인할 수 있다. V$SEQ 성능 뷰에 대한 자세한 내용은 General Reference의 데이터 딕셔너리 장의 성능 뷰 절을 참고한다.
<질의> 13 부터 시작해서 3씩 증가하고 최소값이 0, 최대값이 무한대인 seq1시퀀스를 생성하라.
iSQL> CREATE SEQUENCE seq1
START WITH 13
INCREMENT BY 3
MINVALUE 0 NOMAXVALUE;
Create success.
iSQL> INSERT INTO seqtbl VALUES(seq1.NEXTVAL);
1 row inserted.
iSQL> INSERT INTO seqtbl VALUES(seq1.NEXTVAL);
1 row inserted.
iSQL> SELECT * FROM seqtbl;
SEQTBL.I1
--------------
1
2
3
4
5
6
7
8
9
10
13
16
12 rows selected.
<질의> 시퀀스 seq1을 50씩 증가 시키되 최대값 100에 도달한 경우에는 다시 최소값부터 시작하도록 변경하라.
iSQL> ALTER SEQUENCE sys.seq1
INCREMENT BY 50
MAXVALUE 100
CYCLE;
Alter success.
iSQL> INSERT INTO sys.seqtbl VALUES(seq1.NEXTVAL);
1 row inserted.
iSQL> INSERT INTO sys.seqtbl VALUES(seq1.NEXTVAL);
1 row inserted.
iSQL> INSERT INTO sys.seqtbl VALUES(seq1.NEXTVAL);
1 row inserted.
iSQL> INSERT INTO sys.seqtbl VALUES(seq1.NEXTVAL);
1 row inserted.
iSQL> SELECT * FROM sys.seqtbl;
SEQTBL.I1
--------------
1
2
3
4
5
6
7
8
9
10
13
16
66
0
50
100
16 rows selected.
<질의> 새 번호 생성 전에 시퀀스 seq1의 현재 값을 확인하라.
iSQL> SELECT seq1.CURRVAL FROM dual;
SEQ1.CURRVAL
-----------------------
100
1 row selected.
<질의> 칼럼 i1의 값을 seq1 시퀀스의 다음 값인 0으로 갱신하라.
iSQL> UPDATE SEQTBL SET i1 = seq1.NEXTVAL;
16 rows updated.
<질의> 시퀀스 seq1의 현재 값을 확인하라.
iSQL> SELECT seq1.CURRVAL FROM dual;
SEQ1.CURRVAL
-----------------------
0
1 row selected.
<질의> 빠른 액세스를 위해 명시된 값 (25개) 만큼 시퀀스 값들을 메모리에 캐시하도록 시퀀스 seq1을 변경하라.
iSQL> ALTER SEQUENCE seq1
INCREMENT BY 2
MAXVALUE 200
CACHE 25;
Alter success.
iSQL> CREATE OR REPLACE PROCEDURE proc2
AS
BEGIN
FOR i IN 1 .. 30 LOOP
INSERT INTO sqqtbl VALUES(seq1.NEXTVAL);
END LOOP;
END;
/
Create success.
iSQL> EXEC proc2;
Execute success.
iSQL> SELECT * FROM seqtbl;
SEQTBL.I1
--------------
0
50
100
0
50
100
0
50
100
0
50
100
0
50
100
0
2
4
6
8
10
12
14
.
.
58
60
46 rows selected.
<질의> SYS 계정으로 데이터베이스에 접속한 경우 아래 쿼리는 모든 시퀀스들의 정보를 출력한다.
iSQL> SELECT * FROM SEQ;
USER_NAME
--------------------------------------------
SEQUENCE_NAME CURRENT_VALUE INCREMENT_BY
------------------------------------------------
MIN_VALUE MAX_VALUE CYCLE CACHE_SIZE
------------------------------------------------
SYS
SEQ1 60 2
0 200 YES 25
1 row selected.
<질의> 다음 SQL문들을 이용하여 여러 계정에서 새로운 시퀀스를 정의하고 시퀀스 값과 정보를 확인해본다.
iSQL> CONNECT sys/manager;
Connect success.
iSQL> CREATE USER user1 IDENTIFIED BY user1;
Create success.
iSQL> CREATE USER user2 IDENTIFIED BY user2;
Create success.
iSQL> CONNECT user1/user1;
Connect success.
iSQL> CREATE SEQUENCE seq1 MAXVALUE 100 CYCLE;
Create success.
iSQL> CREATE SEQUENCE seq2;
Create success.
<질의> user1이 생성한 모든 시퀀스의 정보를 출력한다.
iSQL> SELECT * FROM SEQ;
SEQUENCE_NAME CURRENT_VALUE INCREMENT_BY
------------------------------------------------
MIN_VALUE MAX_VALUE CYCLE CACHE_SIZE
------------------------------------------------
SEQ1 1 1
1 100 YES 20
SEQ2 1 1
1 9223372036854775806 NO 20
2 rows selected.
iSQL> CONNECT user2/user2;
Connect success.
iSQL> CREATE SEQUENCE seq1 INCREMENT BY -30;
Create success.
iSQL> CREATE SEQUENCE seq2 INCREMENT BY -10 MINVALUE -100;
Create success.
iSQL> CONNECT sys/manager;
Connect success.
iSQL> CREATE SEQUENCE seq2 START WITH 20 INCREMENT BY 30;
Create success.
iSQL> CREATE SEQUENCE seq3 CACHE 40;
Create success.
<질의> SYS 계정으로 데이터베이스에 접속한 경우 아래 쿼리는 모든 시퀀스의 정보를 출력한다.
iSQL> SELECT * FROM SEQ;
USER_NAME
--------------------------------------------
SEQUENCE_NAME CURRENT_VALUE INCREMENT_BY
------------------------------------------------
MIN_VALUE MAX_VALUE CYCLE CACHE_SIZE
------------------------------------------------
SYS
SEQ1 60 2
0 200 YES 25
SYS
SEQ2 20 30
1 9223372036854775806 NO 20
SYS
SEQ3 1 1
1 9223372036854775806 NO 40
USER1
SEQ1 1 1
1 100 YES 20
USER1
SEQ2 1 1
1 9223372036854775806 NO 20
USER2
SEQ1 -1 -30
-9223372036854775806 -1 NO 20
USER2
SEQ2 -1 -10
-100 -1 NO 20
7 rows selected.
<질의> 캐시의 크기가 100이고 시퀀스 이중화용 테이블을 생성하는 시퀀스 seq1를 생성하라.
CREATE SEQUENCE seq1 CACHE 100 ENABLE SYNC TABLE;