MyBatis

LPAD, NEXTVAL (ID 관리)

99duuk 2024. 9. 9. 13:32

 

 


1. LPAD 함수

LPAD(str, len, padstr)

 

  • str: 패딩을 적용할 원본 문자열
  • len: 결과 문자열의 총 길이
  • padstr: 왼쪽에 채울 문자 또는 문자열

 

LPAD 함수는 지정된 길이 len에 도달할 때까지 str의 왼쪽에 padstr을 반복해서 채움

 

SELECT LPAD('MariaDB', 10, '*');
-- 결과: '***MariaDB'

 


2. NEXTVAL 함수

NEXTVAL(sequence_name)

NEXTVAL은 지정된 시퀀스의 다음 값을 반환함

 

CREATE SEQUENCE sample
    START WITH 1
    INCREMENT BY 1;
SELECT NEXTVAL(sample);
-- 결과: 1 (첫 번째 호출 시)

LPAD와 NEXTVAL 함께 사용하기

LPAD와 NEXTVAL을 결합하여 사용하면, 일정한 형식의 순차적인 코드를 생성할 수 있음

SELECT LPAD(NEXTVAL(sample), 10, '0') AS formatted_id;

 

  • NEXTVAL(sample)이 호출되어 'sample' 시퀀스의 다음 값을 생성함
  • LPAD 함수가 이 번호를 받아, 총 길이가 10이 되도록 왼쪽에 '0'을 채움
  • 결과적으로 '0000000001', '0000000002', '0000000003' 등과 같은 형식의 코드가 생성됨

 

고정 길이의 순차적인 코드가 필요할 때 사용

- 직원 ID, 주문 번호, 문서 코드 등을 생성할 때 사용할 수 있음

 

// LPAD 함수를 사용할 때, 원본 값이 지정된 길이보다 길면 왼쪽에서부터 잘림

<select id="getFormattedId" resultType="string">
    SELECT LPAD(NEXTVAL(sample), 10, '0') AS formatted_id
</select>

 


<update>
    <selectKey keyProperty="..." resultType="string" order="BEFORE">
        SELECT LPAD(NEXTVAL(...), 10, '0') FROM DUAL
    </selectKey>
    INSERT INTO ... (...) VALUES ...
</update>

 

  • <selectKey> 부분:
    • order="BEFORE": 이는 주 INSERT 쿼리 실행 전에 이 selectKey 쿼리를 실행
    • LPAD(NEXTVAL(...), 10, '0'): 시퀀스의 다음 값을 가져와 10자리 문자열로 만들고, 왼쪽에 0을 채움
    • (FROM DUAL: MariaDB에서는 DUAL 테이블이 필요 없지만, 다른 데이터베이스와의 호환성을 위해 사용될 수 있음)
    • 이 쿼리의 결과는 keyProperty로 지정된 변수에 저장됨
  • INSERT INTO ... 부분:
    • 위에서 생성된 고유 ID를 포함하여 새 레코드를 테이블에 삽입
  • 전체 프로세스:
    • 먼저, 시퀀스에서 다음 값을 가져와 형식화된 문자열 ID를 생성
    • 이 생성된 ID는 자동으로 파라미터 객체의 속성(keyProperty로 지정된)에 설정
    • 그 다음, INSERT 쿼리가 실행되어 새 레코드를 테이블에 추가합니다. 이 때 방금 생성한 ID가 사용됨

 

 

이 방법의 장점

  • 데이터베이스의 AUTO_INCREMENT 기능 대신 커스텀 ID 생성 로직을 사용할 수 있음.
  • ID의 형식을 원하는 대로 지정할 수 있음(여기서는 10자리 숫자 문자열).
  • 시퀀스를 사용하므로 고유성이 보장됨

 

- 특정 형식의 ID가 필요하거나, AUTO_INCREMENT로는 충족할 수 없는 ID 생성 요구사항이 있을 때 유용함

 

 

  • 여러 개의 자동 증가 컬럼이 필요한 경우:
    • AUTO_INCREMENT는 테이블당 하나만 사용할 수 있기 때문에, 여러 개의 자동 증가 컬럼이 필요하다면 LPAD + NEXTVAL 조합을 사용할 수 있음
    • 예: 주문 번호와 송장 번호를 별도로 자동 생성해야 하는 경우
  • 복합 기본 키(Composite Primary Key)를 사용하는 경우:
    • 복합 키의 일부로 AUTO_INCREMENT를 사용할 수 있지만, 첫 번째 컬럼에만 가능함
    • 만약 복합 키의 다른 부분에도 자동 생성된 값이 필요하다면, LPAD + NEXTVAL을 사용할 수 있음
  • 커스텀 형식의 ID가 필요한 경우:
    • AUTO_INCREMENT는 단순히 숫자를 증가시키지만, LPAD + NEXTVAL을 사용하면 원하는 형식(예: 'ORD0000001')의 ID를 생성할 수 있음
-- 두 개의 자동 생성 ID가 필요한 경우
CREATE SEQUENCE order_seq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE invoice_seq START WITH 1 INCREMENT BY 1;

INSERT INTO orders (order_id, invoice_id, customer_name)
SELECT 
    CONCAT('ORD', LPAD(NEXTVAL(order_seq), 7, '0')),
    CONCAT('INV', LPAD(NEXTVAL(invoice_seq), 7, '0')),
    'John Doe';

-- 결과: order_id: 'ORD0000001', invoice_id: 'INV0000001'