DB

[DB] auto_increment란? (자동 증가 열 생성/추가)

콩다영 2024. 4. 16.
728x90

 

MySQL의 Auto increment

 

mysql에서는 'auto_increment' 기능을 사용하여 열에 자동으로 고유한 값을 생성한다.

주로 기본 키 (primary key)를 위해 사용되며, 새로운 행(row)이 삽입될 때 MySQL은 해당 열에 다음 사용 가능한 정수 값을 자동으로 할당한다. 이 기능을 통해 기본 키 값을 생성하는 과정이 간단해지며, 테이블 내에서 유일성을 보장한다.

 

반면에 Oracle에서는 MySQL의 'auto_increment'와 정확한 동등한 기능을 갖고 있지 않다.

Oracle은 대신 고유한 값을 생성하기 위해 시퀀스를 사용한다. 시퀀스는 고유한 정수 값을 생성하는 데이터베이스 객체이다. MySQL의 auto_increment 열과 달리 Oracle의 시퀀스는 특정 테이블에 직접 연결되어 있지 않다.

대신 여러 테이블 또는 여러 데이터베이스에서 공유될 수 있다.

 

 

추가적으로 필자가 속해 있는 금융 IT에서 시퀀스에 대한 얘기를 적어보자면,

금융 IT개발에서는 시퀀스를 주로 거래 테이블 내에서 키본 키를 생성하는 데 사용하지 않는다. 

이는 금융 시스템데이터 무결성과 감사 가능성을 보장하기 위해 기본 키 생성에 엄격한 제어를 필요로 하기 때문이다.

대신 시퀀스는 대량의 데이터가 일괄 처리되는 시나리오에서 사용될 수 있다. 이러한 시나리오에서는 대량의 데이터가 일괄적으로 처리되며 고유한 식별자가 필요하다. 예를 들어 배치를 돌릴 때 는 종종 사용하기도 한다고 한다. 

 

 

 

  DB 내에서 시퀀스 생성 및 사용

: Oracle에서 시퀀스를 생성하고 사용하려면 다음과 같은 SQL 명령을 사용할 수 있다.

CREATE SEQUENCE seq_name
	START WITH 1
    INCREMENT BY 1
    NOCACHE;

이렇게 하면 'seq_name'인 시퀀스가 생성되며, 각 호출마다 1씩 증가하는 시퀀스가 시작된다.

이 시퀀스를 테이블에서 사용하려면 삽입 문에서 참조할 수 있다.

INSERT INTO table_name (id, col1, col2)
VALUES (seq_name.nextval, value1, value2);

여기서 'seq_name.nextval'은 시퀀스 'seq_name'에서 다음 값을 검색하여 'id'열의 고유성을 보장한다.

 

 

 

필자는 현재 MariaDB를 사용하여 프로젝트를 진행하고 있다. ( Tool은 DBeaver 24.0.1을 사용 )

MariaDB에서는 시퀀스라는 개념을 직접적으로 지원하지 않는다. 대신에 자동증가(auto-increment) 열을 사용하여 유사한 기능을 구현한다. 따라서 MariaDB에서는 위와 같이 ' CREATE SEQUENCE'문을 사용할 수 없다.

 

대신에 MariaDB에서는 테이블을 생성할 때 자동 증가 열을 정의하여 유사한 기능을 구현할 수 있다.

예를 들어, 다음과 같이 테이블을 생성할 수 있다.

CREATE TABLE your_table_name (
	id BIGINT AUTO_INCREMENT PRIMARY KEY,
    col1 VARCHAR(255),
    col2 VARCHAR(255)
) ENGINE=InnoDB;

이렇게 하면 'id' 열이 자동으로 증가하는 기능을 가진 자동 증가 열로 정의된다.

이 자동 증가 열을 사용하여 값을 생성하면 시퀀스와 유사한 동작을 얻을 수 있다.

 

 

 

하지만, 지금 프로젝트에서는 'auto-increment' 대신 seq를 생성하여 사용하라고 조언을 받아서 

sequence를 생성하여 사용하는 방식을 정리하겠다 ! 

 

▼ Tables 하단에 보면 Sequences가 있다. 여기에 사용하려는 컬럼의 seq를 생성한다.

seq 생성.

 

들어가 보면, 시작하는 숫자와 min, max를 지정할 수 있다.

sequence properties

 

 

위와 같이 설정해 주고 SQL 쿼리를 작성할 때

시퀀스를 사용할 컬럼 VALUE에 NEXTVAL(DOC_NO_seq)를 넣어주면 된다.

INSERT INTO ANNUAL_MANAGEMENT_TBL
( DOC_NO
, EMP_NO
, EMP_NAME
)
VALUES
( NEXTVAL(DOC_NO_seq)
, '001234'
, '홍길동'
);

위의 쿼리에서 ' NEXTVAL(DOC_NO_seq)' 를 사용하여 DOC_NO_seq 시퀀스의 다음 값을 가져와서  

DOC_NO 열에 삽입한다. 이렇게 함으로써 새로운 값을 생성하면서 중복을 방지할 수 있다.

 

 

 

 

DB마다 성격이 다르고 사용할 수 있는 범위가 다르니

유의해서 상황에 맞게 사용하면 될 것 같다 !!!!! :D

 

 

728x90
반응형

댓글