Oracle - 시퀀스(sequence)

SEQUENCE

자동 번호 발생기 역할을 하는 객체(순차적으로 정수 값을 자동으로 생성)

UNIQUE한 값을 컬럼에 입력할 수 있음 / PRIMARY KEY 값을 생성하기 위해 사용

테이블과 독립적으로 저장되고 생성되므로 하나의 시퀀스는 여러 테이블에서 사용 가능

 

시퀀스 생성

/*
    CREATE SEQUENCE 시퀀스이름
    
    [START WITH 숫자] -- 처음 발생시킬 시작 값 지정, 생략하면 1이 기본
    [INCREMENT BY 숫자] -- 다음 값에 대한 증가치, 생략하면 자동 1이 기본
    [MAXVALUE 숫자 | NOMAXVALUE] -- 발생 시킬 최대 값 지정
    [MINVALUE 숫자 | NOMINVALUE] -- 발생 시킬 최소 값 지정
    [CYCLE | NOCYCLE] -- 값 순환 여부 지정
    [CACHE 바이트 크기 | NOCACHE] -- 캐쉬 메모리 기본 값은 20바이트 최소 값은 2바이트
*/
CREATE SEQUENCE SEQ_EMP_ID
START WITH 300
INCREMENT BY 5
MAXVALUE 310
NOCYCLE
NOCACHE;

시퀀스 데이터 딕셔너리에서 확인가능

SELECT * 
  FROM USER_SEQUENCES;

 

SEQUENCE 사용

/*
    시퀀스명.CURRVAL : 현재 생성 된 시퀀스 값
    시퀀스명.NEXTVAL : 시퀀스 값을 증가시킴. 기존 시퀀스 값에서 증가치만큼 증가한 값.
*/

 

-- NEXTVAL를 실행하지 않고 방금 생성 된 CURRVAL를 호출하면 오류 발생
-- CURRVAL는 마지막으로 호출 된 NEXTVAL의 값을 저장하여 보여주는 임시 값이기 때문 
SELECT SEQ_EMP_ID.CURRVAL FROM DUAL;

-- 시작값 300으로 조회
SELECT SEQ_EMP_ID.NEXTVAL FROM DUAL;
SELECT SEQ_EMP_ID.CURRVAL FROM DUAL;
-- 증가값 5가 더해진 305로 조회
SELECT SEQ_EMP_ID.NEXTVAL FROM DUAL;
SELECT SEQ_EMP_ID.CURRVAL FROM DUAL;
-- 310
SELECT SEQ_EMP_ID.NEXTVAL FROM DUAL;
SELECT SEQ_EMP_ID.CURRVAL FROM DUAL;
-- 지정한 MAXVALUE 값을 초과 했기 때문에 오류 발생
SELECT SEQ_EMP_ID.NEXTVAL FROM DUAL;
-- CURRVAL는 성공적으로 호출 된 마지막 NEXTVAL의 값을 저장하고 출력
SELECT SEQ_EMP_ID.CURRVAL FROM DUAL;

 

CURRVAL / NEXTVAL 사용가능여부

1) 사용가능

 1. 서브쿼리가 아닌 SELECT문

 2. INSERT문의 SELECT절

 3. INSERT문의 VALUES절

 4. UPDATE문의 SET절

 

2) 사용불가

 1. VIEW의 SELECT절

 2. DISTINCT 키워드가 있는 SELECT문

 3. SELECT, DELETE, UPDATE문의 서브쿼리

 4. CREATE, TABLE, ALTER, TABLE 명령의 DEFAULT 값

 

SEQUENCE 사용 예제

1. 시퀀스 생성

-- 시퀀스 생성
CREATE SEQUENCE SEQ_EID
START WITH 300
INCREMENT BY 1
MAXVALUE 10000
NOCYCLE
NOCACHE;

-- 시퀀스 명이름이 SEQ_EID이고 시작값은 300 1씩증가하며, 최대 값은 10000이고, 반복하지않는다
-- 라는뜼 ?..

2. INSERT문 추가

-- 사용 가능 예시(INSERT문의 VALUES절 - PK 용도)
INSERT INTO EMPLOYEE
VALUES(SEQ_EID.NEXTVAL, '김영희', '610410-2111111', 'young_123@kh.or.kr',
       '01012346666', 'D1', 'J1', 'S1', 5000000, 0.2, 200, SYSDATE, NULL, DEFAULT);

INSERT INTO EMPLOYEE
VALUES(SEQ_EID.NEXTVAL, '김철수', '610410-1111111', 'cheol_123@kh.or.kr',
       '01012346666', 'D1', 'J1', 'S1', 5000000, 0.2, 200, SYSDATE, NULL, DEFAULT);

SELECT * FROM EMPLOYEE;

 

김영희, 김철수의 사원번호 저런식으로 많이쓰이게됨

 

시퀀스 수정

/*
    ALTER SEQUENCE 시퀀스이름
    [INCREMENT BY 숫자] -- 다음 값에 대한 증가치, 생략하면 자동 1이 기본
    [MAXVALUE 숫자 | NOMAXVALUE] -- 발생 시킬 최대 값 지정
    [MINVALUE 숫자 | NOMINVALUE] -- 발생 시킬 최소 값 지정
    [CYCLE | NOCYCLE] -- 값 순환 여부 지정
    [CACHE 바이트 크기 | NOCACHE] -- 캐쉬 메모리 기본 값은 20바이트 최소 값은 2바이트
    
    ** START WITH은 변경 불가 (DROP 후 재생성) **
*/
ALTER SEQUENCE SEQ_EMP_ID
INCREMENT BY 10
MAXVALUE 400
NOCYCLE
NOCACHE;
-- 시퀀스 변경 확인
SELECT *
FROM USER_SEQUENCES;

 

시퀀스 변경확인

SELECT SEQ_EMP_ID.NEXTVAL FROM DUAL;
SELECT SEQ_EMP_ID.CURRVAL FROM DUAL;

 

시퀀스 삭제

DROP SEQUENCE SEQ_EMP_ID;

 

시퀀스 삭제확인

SELECT * FROM USER_SEQUENCES;

'프로그래밍 > Database(Oracle)' 카테고리의 다른 글

Oracle - INDEX  (0) 2021.07.07
Oracle - DCL(GRANT, REVOKE)  (0) 2021.07.06
Oracle - view  (0) 2021.07.06
ORACLE - ALTER, DROP  (0) 2021.07.05
Oracle - INSERT, UPDATE, DELETE  (0) 2021.07.05
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유