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'
'MyBatis' 카테고리의 다른 글
INTERVAL (1) | 2024.11.19 |
---|---|
MyBatis는 쿼리 결과를 DTO에 매핑할 때 setter 메소드를 사용함 (0) | 2024.09.23 |
계층 쿼리 (중첩 SELECT_mysql, CTE_mysql, CONNECT BY_oracle) (0) | 2024.09.09 |
@변수명 := (0) | 2024.09.09 |
<sql>, <include>, <selectKey> (0) | 2024.09.09 |