[Oracle] 오라클 INSERT 1씩 증가시키는 방법 (MAX+1, 시퀀스)
- 데이터베이스/오라클
- 2022. 1. 11.
오라클에서는 칼럼의 값을 자동으로 증가시키는 기능이 없기 때문에 INSERT 작업 시 직접 일련번호를 매번 후 데이터를 입력해야 한다. 가장 많이 사용하는 방법은 일련번호 칼럼의 마지막 값을 가져와서 +1 하여 사용한다. 그러나 MAX+1의 단점은 테이블의 트랜잭션이 과도하게 발생하면 중복으로 번호가 채번 되어서 입력 시 오류가 발생할 수 있다.
|
테이블의 INSERT 건수가 많이 없거나 프로그램을 잘 설계하였다면 MAX + 1의 방법으로 채번을 해도 큰 문제가 없지만, INSERT가 많이 발생한다면 중복 채번을 예방하기 위해서 시퀀스를 사용할 것을 권장한다.
MAX + 1 사용하는 방법
INSERT INTO emp( empno
, ename
, job
, mgr
, hiredate
)
VALUES( (SELECT NVL(MAX(empno), 0) + 1 FROM emp)
, 'GENT'
, 'BLOGGER'
, 7839
, TRUNC(SYSDATE)
)
INSERT 작업 수행 시 서브 쿼리를 사용하여 자신의 테이블에서 MAX + 1을 채번 후 입력한다.
일련번호 채번 시 데이터가 없으면 NULL이 반환되기 때문에 NVL을 사용하여 0으로 치환 후 +1을 한다.
INSERT INTO emp( empno
, ename
, job
, mgr
, hiredate
)
VALUES( NVL((SELECT /*+ INDEX_DESC(a EMP_PK) */
a.empno
FROM emp a
WHERE ROWNUM = 1), 0) + 1
, 'GENT'
, 'BLOGGER'
, 7839
, TRUNC(SYSDATE)
)
일련번호 칼럼에 인덱스가 생성되어 있다면 인덱스 힌트(INDEX_DESC)를 사용하여 마지막으로 입력된 일련번호 1건을 조회하여 +1을 하여 입력한다.
MAX + 1보다 조금 더 성능이 좋은 방법이다. (MAX + 1 중복 채번 가능성을 조금 더 최소화)
시퀀스 사용하는 방법
CREATE SEQUENCE emp_seq
INCREMENT BY 1
START WITH 8000 --시작값 1로 설정
MINVALUE 1
MAXVALUE 99999
NOCYCLE
NOCACHE
NOORDER;
시퀀스를 생성하는 쿼리이다. 시작 값(START WITH)은 1부터 시작하면 된다. (테스트 때문에 8000부터 시작)
INSERT INTO emp( empno
, ename
, job
, mgr
, hiredate
)
VALUES( emp_seq.NEXTVAL
, 'GENT'
, 'BLOGGER'
, 7839
, TRUNC(SYSDATE)
)
시퀀스를 사용하면 중복 채번이 발생하지 않는다. 시퀀스의 단점은 한번 채번 된 값을 삭제할 경우 이전 일련번호를 사용하기 쉽지 않다는 점이다. 만약 일련번호가 모두 순차적으로 존재해야 한다면 관리하기 쉽지 않다.