[SQL] Oracle 시퀀스(Sequence) 정리 – CREATE / NEXTVAL / CURRVAL / IDENTITY 컬럼
by 우와한개발자
[ 시퀀스 Sequence ]
1. 시퀀스(Sequence)란?
- 자동으로 유일한(unique) 번호 생성하는 객체
- 주로 PRIMARY KEY 값을 자동 증가시킬 때 사용
[Oracle의 객체(Object) 관리]
더보기
⚠️ 오라클이 생성하는 것들은 전부 객체(Object)로 관리됨
- 객체 관리
CREATE 객체종류 이름 ... -- 생성
ALTER 객체종류 이름 ... -- 수정
DROP 객체종류 이름; -- 삭제
- 데이터 딕셔너리에 자동 등록
SELECT * FROM USER_OBJECTS; -- 내 모든 객체 한번에 조회 가능
| 주요 객체 | 설명 |
| TABLE | 데이터 저장 |
| VIEW | 가상 테이블 |
| SEQUENCE | 자동 번호 생성 |
| INDEX | 검색 속도 향상 |
| SYNONYM | 객체 별칭 |
| PROCEDURE | 절차형 SQL |
| FUNCTION | 반환값 있는 절차형 SQL |
| TRIGGER | 자동 실행 SQL |
| PACKAGE | 프로시저/함수 묶음 |
| TYPE | 사용자 정의 타입 |
2. 시퀀스(Sequence) 생성
CREATE SEQUENCE 시퀀스명
[START WITH n] -- 시작 번호 (기본값 1)
[INCREMENT BY n] -- 증가값 (기본값 1)
[MAXVALUE n] -- 최대값
[MINVALUE n] -- 최소값
[CYCLE | NOCYCLE] -- 최대값 도달 시 순환 여부
[CACHE n | NOCACHE]; -- 메모리에 미리 할당할 번호 수
| 옵션 | 설명 | 기본값 |
| START WITH | 시작 번호 지정 | 1 |
| INCREMENT BY | 증가값 지정 | 1 |
| MAXVALUE | 최대값 지정 | 10^27 (거의 무한) |
| MINVALUE | 최소값 지정 | 1 |
| CYCLE | 최대값 도달 시 다시 처음부터 순환 | - |
| NOCYCLE | 최대값 도달 시 오류 발생 | 기본값 |
| CACHE | 메모리에 번호 미리 할당 | 20 |
| NOCACHE | 캐시 사용 안 함 | - |
-- 기본 (1부터 1씩 증가)
CREATE SEQUENCE seq_emp;
-- 옵션 전체 사용
CREATE SEQUENCE seq_emp
START WITH 1 -- 1부터 시작
INCREMENT BY 1 -- 1씩 증가
MAXVALUE 1000 -- 최대 1000
MINVALUE 1 -- 최소 1
NOCYCLE -- 최대값 도달 시 오류
CACHE 20; -- 20개 미리 캐시
3. 시퀀스(Sequence) 수정
- START WITH 는 수정 불가 (시작값 바꾸려면 DROP 후 재생성)
ALTER SEQUENCE 시퀀스명
[INCREMENT BY n]
[MAXVALUE n]
[MINVALUE n]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];
4. 시퀀스(Sequence) 삭제
DROP SEQUENCE 시퀀스명;
5. 시퀀스(Sequence) 정보 확인
-- 내 시퀀스만 조회
SELECT * FROM USER_SEQUENCES;
-- 내 모든 객체 조회 (시퀀스 포함)
SELECT * FROM USER_OBJECTS
WHERE OBJECT_TYPE = 'SEQUENCE';
6. 시퀀스(Sequence) 사용
시퀀스명.NEXTVAL -- 다음 번호 생성 (증가)
시퀀스명.CURRVAL -- 현재 번호 조회 (증가 안 함)
-- NEXTVAL : 호출할 때마다 번호 증가
INSERT INTO emp (empno, ename) VALUES (seq_emp.NEXTVAL, 'HONG'); -- 1
INSERT INTO emp (empno, ename) VALUES (seq_emp.NEXTVAL, 'KIM'); -- 2
INSERT INTO emp (empno, ename) VALUES (seq_emp.NEXTVAL, 'LEE'); -- 3
-- CURRVAL : 현재 값 조회
SELECT seq_emp.CURRVAL FROM DUAL; -- 3
⚠️ CURRVAL 주의사항
- 시퀀스 생성 직후 바로 CURRVAL 조회하면 오류 발생( NEXTVAL을 한 번 이상 호출한 후에만 사용 가능)
7. IDENTITY 컬럼
- 오라클 12c부터 추가된 기능
- 시퀀스를 따로 만들지 않고 컬럼에 자동 증가를 바로 설정
- 열 레벨 방식으로 지정 가능
CREATE TABLE 테이블명 (
컬럼명 숫자타입 GENERATED [ALWAYS | BY DEFAULT [ON NULL]] AS IDENTITY [(
[START WITH n] -- 시작 번호 (기본값 1)
[INCREMENT BY n] -- 증가값 (기본값 1)
[MAXVALUE n] -- 최대값
[MINVALUE n] -- 최소값
[CYCLE | NOCYCLE] -- 최대값 도달 시 순환 여부
[CACHE n | NOCACHE] -- 메모리에 미리 할당할 번호 수
)]
);
| 옵션 | 설명 |
| GENERATED ALWAYS | 항상 자동 생성, 직접 값 입력 불가(기본값) |
| GENERATED BY DEFAULT | 자동 생성이지만 직접 값 입력도 가능 |
| GENERATED BY DEFAULT ON NULL | NULL 입력 시에만 자동 생성 |
1) GENERATED ALWAYS
- 해당 컬럼의 값을 항상 자동으로 생성
- 직접 값 입력 불가
CREATE TABLE emp (
empno NUMBER GENERATED AS IDENTITY -- 기본값 : ALWAYS
);
CREATE TABLE emp (
empno NUMBER GENERATED ALWAYS AS IDENTITY,
ename VARCHAR2(20)
);
INSERT INTO emp (ename) VALUES ('HONG'); -- empno 자동 생성
INSERT INTO emp VALUES (999, 'HONG'); -- ❌ 오류 (직접 입력 불가)
2) GENERATED BY DEFAULT
- 해당 컬럼의 값을 항상 자동으로 생성
- 직접 값을 입력할 수 있음.
CREATE TABLE emp (
empno NUMBER GENERATED BY DEFAULT AS IDENTITY,
ename VARCHAR2(20)
);
INSERT INTO emp (ename) VALUES ('HONG'); -- ✅ 자동 생성
INSERT INTO emp VALUES (999, 'HONG'); -- ✅ 직접 입력도 가능
⚠️BY DEFAULT로 지정하고 해당 값을 직접 입력한 경우 주의사항
- IDENTITY가 자동으로 갱신되지 않기 때문에 나중에 자동 증가값과 충돌하여 PK 중복 등의 오류가 발생할 수 있음
- 직접 입력 후 IDENTITY 시작값을 재설정하여 오류 예방
Mysql의 AUTO_INCREMENT와 Oracle의 시퀀스/IDENTITY 비교
| 기능 | MySQL AUTO_INCREMENT | Oracle 시퀀스 | Oracle IDENTITY |
| 시작값 설정 | ✅ 테이블 단위 | ✅ | ✅ |
| 증가값 설정 | ✅ 서버 전체 적용 | ✅ 시퀀스 단위 | ✅ 컬럼 단위 |
| 최대값 설정 | ❌ | ✅ | ✅ |
| 최소값 설정 | ❌ | ✅ | ✅ |
| 순환 (CYCLE) | ❌ | ✅ | ✅ |
| 직접 값 입력 | ✅ | ✅ | 옵션에 따라 다름 |
| 여러 테이블 공유 | ❌ | ✅ | ❌ 컬럼 전용 |
| 별도 객체 생성 | ❌ | ✅ 필요 | ❌ |
| 캐시 설정 | ❌ | ✅ | ✅ |
| 사용 버전 | 전 버전 | 전 버전 | 12c 이상 |
'데이터베이스 > SQL' 카테고리의 다른 글
블로그의 정보
우와한개발자 님의 블로그
우와한개발자