Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- mssql
- DBMS
- java
- docker
- PostgreSQL
- 독서
- 인터페이스
- MariaDB
- IntelliJ
- 네트워크
- Linux
- mysql
- 오블완
- github
- 인덱스
- Python
- spring
- 명령어
- pandas
- springboot
- SQL
- Kibana
- git
- 책
- 후기
- 리눅스
- oracle
- Javascript
- 티스토리챌린지
- 자바
Archives
- Today
- Total
hanker
[Oracle] 오라클 기본키 자동 증가 기능 구현 (Auto Increment) 본문
반응형
오라클에서 기본키 값 자동 증가하는 방법에 대해서 알아보자.
1. Oracle 12c 이후 버전
Oracle 12c 이후 버전에 대해서는 사실 Auto Increment 기능이 있다.
IDENTITY 를 사용하여 간단하게 자동 증가 시킬 수 있다.
CREATE TABLE employees (
emp_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
emp_name VARCHAR2(100),
hire_date DATE
);
좀 더 세부적으로 설정해보자.
CREATE TABLE employees (
emp_id NUMBER GENERATED BY DEFAULT AS IDENTITY (
START WITH 1
INCREMENT BY 1
MAXVALUE 999999999
NOCACHE
NOCYCLE
) PRIMARY KEY,
emp_name VARCHAR2(100),
hire_date DATE
);
- GENERATED BY DEFAULT : 키 값 지정 가능 / GENERATED ALWAYS : 값을 직접 지정 불가
- START WITH : 시작 값
- INCREMENT BY : 증가 값
- MAXVALUE : 최대값
- NOCACHE : 캐시 사용 안함 (안전하지만 느림)
- NOCYCLE : 순환 설정 (최대 값 도달시 최솟값으로 돌아가지 않음)
2. Oracle 11g 이하 버전
2-1. MAX 함수 사용 (권장 X)
데이터 삽입 시 MAX 함수를 사용하여 키 증가
INSERT INTO employees (emp_id, emp_name, hire_date)
VALUES (
(SELECT NVL(MAX(emp_id), 0) + 1 FROM employees),
'김철수',
SYSDATE
);
해당 MAX함수를 사용하면 문제점들이 여러가지가 있어 권장하지 않는다.
- 동시성 문제 : 두 사용자가 동시에 실행하면 같은 ID가 생성될 수 있음.
- 성능 문제 : MAX함수를 사용하면 매번 전체 테이블을 스캔해야 함
- 만약 사용해야한다면 LOCK을 걸어 동시성 문제를 해결해야 함
2-2. 시퀀스 사용
시퀀스를 사용하면 보다 편하게 기본키 자동 증가 기능을 구현할 수 있다.
CREATE SEQUENCE emp_seq
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
시퀀스 생성 후 NEXT_VAL을 사용하여 키를 증가 시킨다.
INSERT INTO employees (emp_id, emp_name, hire_date)
VALUES (emp_seq.NEXTVAL, '박민수', SYSDATE);
반응형
'DATABASE > ORACLE' 카테고리의 다른 글
[Oracle] ORA-01722: 수치가 부적합합니다. 오라클 에러 조치하기 (0) | 2025.06.10 |
---|---|
ORACLE - 컬럼 값 자르기, 값 자르기 후 값 비교 (0) | 2020.08.14 |
ORACLE - 특정 컬럼을 포함하고 있는 Table 찾기 (0) | 2020.08.14 |