본문으로 바로가기

[Oracle]오라클 INSERT시 자동채번(MAX+1)

category DB\SQL 2019. 2. 20. 11:13

자동으로 증가하는 컬럼을 PK로 잡거나 할떄 INSERT시 자동 증가로 시퀀스를 사용하지만 MAX+1을 사용할 때도 있다.


하지만 MAX+1은 동시성보장이 되지않아 insert 시 다른 트랜잭션에의해 중복값이 등록 될 수 있어 주의해야한다.


사용하는 방법은 간단하다.

SELECT NVL(MAX(증가컬럼)+1,0FROM 테이블)
cs

위 구문을 INSERT VALUE 절에 넣어주면 된다.


테스트 테이블(COUNTRIES)


위 테이블에 REGION_ID를 증가시켜 입력하기.

INSERT INTO COUNTRIES(
        COUNTRY_ID,
        COUNTRY_NAME,
        REGION_ID) 
    VALUES(
        'CB',
        'CODING BUB',
        (SELECT NVL(MAX(REGION_ID)+1,0FROM COUNTRIES));
cs





댓글을 달아 주세요

  1. 이석영 2019.06.04 20:08

    질문하나해도 될까요???

    제가 oracle 로 insert select 문을 사용하려고 합니다.

    select 로 가져온 정보를 insert 하려고 하는데 ... 안되는 것이 있습니다.. ㅠㅠ


    insert tabel 안에 pk 값으로 result_id (number) 가 있습니다.
    예를 들어

    table A 정보

    result_id(pk, not null) number
    name varchar2
    address varchar2
    age number

    [
    insert (result_id, name, address, age)

    select --- from tableB
    ]

    위와 같이 insert select 문을 사용하고자 하는데 문제는 table B에는 result_id 컬럼이 없습니다.

    원하는 결과는 result_id가 하나씩 증가해서 겹치지 않게 하는 것인데..

    insert (result_id, name, address, age)

    select
    (select NVL(MAX(result_id),0)+1 from tableA ) from result_id
    , name
    , address
    , age
    from tableB
    이렇게 하면.... 컬럼 갯수가 몇개든지 간에 다 result_id 값이 1로 출력되서 tableA pk 제약 조건에 걸려서 insert 가 안됩니다....

    방법이 없을 까요 ???ㅜ.ㅜ

  2. ritkim 2019.06.20 14:12

    rownum을 이용하면 될 듯하네요.

    insert (result_id, name, address, age)

    select
    (select NVL(MAX(result_id),0) from tableA ) + rownum as result_id
    , name
    , address
    , age
    from tableB

  3. BlogIcon 코딩병원 2020.08.12 14:02 신고

    잘보고갑니다 ^^~