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를 생성한다.
들어가 보면, 시작하는 숫자와 min, max를 지정할 수 있다.
위와 같이 설정해 주고 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
'DB' 카테고리의 다른 글
[DB] excel 데이터를 insert문으로 변환하기 (0) | 2024.06.12 |
---|---|
[DB] 클라우드 환경에서 Redis 사용 방법 - session 불일치 해결 방법 (0) | 2024.05.28 |
[postgreSQL] org.postgresql.util.PSQLException: 오류: 연산자 없음 에러 처리하기 (0) | 2024.04.30 |
[DB] SQL Injection 방지를 위한 안전한 쿼리 작성: ${} 대신 Prepared Statements 활용 (0) | 2024.04.25 |
댓글