데이터베이스 - 시퀀스(Sequence)

2022. 11. 9. 17:31데이터베이스

시퀀스(SEQUENCE)

 - 값의 의미가 없다.

 

시퀀스 생성과 확인

SQL> CREATE SEQUENCE 시퀀스 
 2 [ START WITH 시작_값
 3 INCREMENT BY 증가_값 
 4 MAXVALUE [상한_값 | NOMAXVALUE]
 5 MINVALUE [하한_값 | NOMINVALUE]
 6 CYCLE | NOCYCLE 
 7 CACHE [cache_개수| NOCACHE]];

 

SQL> ALTER SEQUENCE 시퀀스 
 2 INCREMENT BY 증가_값 
 3 MAXVALUE [상한_값 | NOMAXVALUE]
 4 MINVALUE [하한_값 | NOMINVALUE]
 5 CYCLE | NOCYCLE 
 6 CACHE cache_개수| NOCACHE;

 

SQL> DROP SEQUENCE 시퀀스;

 

SQL> SELECT sequence_name, max_value, min_value, increment_by,
 2 cache_size, last_number, cycle_flag
 3 FROM user_sequences;

SQL> ... 시퀀스.NEXTVAL ... 

SQL> ... 시퀀스.CURRVAL ...

 

예제 1. 실습용 시퀀스를 생성하고 생성된 시퀀스의 설정을 검색한다. 

SQL> CREATE SEQUENCE emp_eno_seq 
 2 START WITH 1 
 3 INCREMENT BY 1
 4 NOMAXVALUE
 5 NOMINVALUE
 6 NOCYCLE
 7 CACHE 20;
시퀀스가 생성되었습니다.

 

SQL> CREATE SEQUENCE dept_dno_seq; 
시퀀스가 생성되었습니다.

 

SQL> SELECT sequence_name, max_value, min_value, increment_by,
 2 cache_size, last_number, cycle_flag
 3 FROM user_sequences; 

SEQUENCE_NAME   MAX_VALUE  MIN_VALUE  INCREMENT_BY CACHE_SIZE LAST_NUMBER C
--------------- ---------- ---------- ------------ ---------- ----------- -
DEPT_DNO_SEQ    1.0000E+28          1            1         20           1 N
EMP_ENO_SEQ     1.0000E+28          1            1         20           1 N

 

예제 2. 순환 시퀀스를 생성하고 생성된 시퀀스의 설정을 검색한다. 

SQL> CREATE SEQUENCE co_cno_seq 
 2 MAXVALUE 5 
 3 CYCLE; 


CREATE SEQUENCE co_cno_seq
*
1행에 오류:
ORA-04013: CACHE 에는 1 사이클보다 작은 값을 지정해야 합니다

 

SQL> CREATE SEQUENCE co_cno_seq
 2 MAXVALUE 50
 3 CYCLE;
시퀀스가 생성되었습니다.

 

SQL> SELECT sequence_name, max_value, min_value, increment_by,
 2 cache_size, last_number, cycle_flag
 3 FROM user_sequences;

SEQUENCE_NAME   MAX_VALUE  MIN_VALUE  INCREMENT_BY CACHE_SIZE LAST_NUMBER C
--------------- ---------- ---------- ------------ ---------- ----------- -
CO_CNO_SEQ              50          1            1         20           1 Y
DEPT_DNO_SEQ    1.0000E+28          1            1         20           1 N
EMP_ENO_SEQ     1.0000E+28          1            1         20           1 N

 

예제 3. [예제 1]에서 생성한 emp_eno_seq 시퀀스로부터 값을 할당 받아 사용한다.
 - 실습전 emp 테이블의 모든 데이터를 지운다. 

SQL> DELETE FROM emp;
17 행이 삭제되었습니다.


SQL> COMMIT;

커밋이 완료되었습니다.

 

SQL> SELECT sequence_name, max_value, min_value, increment_by, 
 2 cache_size, last_number, cycle_flag
 3 FROM user_sequences;

SEQUENCE_NAME   MAX_VALUE  MIN_VALUE  INCREMENT_BY CACHE_SIZE LAST_NUMBER C
--------------- ---------- ---------- ------------ ---------- ----------- -
CO_CNO_SEQ              50         1             1         20           1 Y
DEPT_DNO_SEQ    1.0000E+28         1             1         20           1 N
EMP_ENO_SEQ     1.0000E+28         1             1         20           1 N

 

SQL> INSERT INTO emp (eno, ename) VALUES (emp_eno_seq.nextval, '첫 번째'); 
1 개의 행이 만들어졌습니다. 

SQL> SELECT emp_eno_seq.currval FROM dual; 
CURRVAL
----------
      1

SQL> SELECT eno, ename FROM emp;
ENO  ENAME
---- -------
   1 첫 번째

SQL> ROLLBACK;
롤백이 완료되었습니다. 

SQL> INSERT INTO emp (eno, ename) VALUES (emp_eno_seq.nextval, '두 번째'); 
1 개의 행이 만들어졌습니다. 

SQL> COMMIT;
커밋이 완료되었습니다. 

SQL> SELECT eno, ename FROM emp;
ENO  ENAME 
---- ---------- 
  2  두 번째

 

SQL> SELECT sequence_name, max_value, min_value, increment_by,
 2 cache_size, last_number, cycle_flag
 3 FROM user_sequences;

SEQUENCE_NAME   MAX_VALUE  MIN_VALUE  INCREMENT_BY CACHE_SIZE LAST_NUMBER C
--------------- ---------- ---------- ------------ ---------- ----------- -
CO_CNO_SEQ             50          1             1        20            1 Y
DEPT_DNO_SEQ   1.0000E+28          1             1        20            1 N
EMP_ENO_SEQ    1.0000E+28          1             1        20           21 N