MySQL 자동 증분 ID 예약하기
MySQL에서 자동 증분(AUTO_INCREMENT) ID를 미리 예약하려면 트랜잭션 시작 → 빈 값 삽입 → 롤백 → LAST_INSERT_ID() 확인의 순서로 처리하면 됩니다. 기본 문법은 다음과 같습니다.
START TRANSACTION;
insert into yourTableName values(),(),(),();
ROLLBACK;
SELECT LAST_INSERT_ID() INTO @anyVariableName;
예제 테이블 생성
문법을 이해하기 위해 먼저 자동 증분 컬럼 하나만 가진 간단한 테이블을 만들어 보겠습니다.
mysql> create table reservingAutoIncrementDemo
-> (
-> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY
-> );
Query OK, 0 rows affected (0.45 sec)
트랜잭션으로 레코드 삽입 후 롤백
트랜잭션을 시작한 뒤 INSERT 명령으로 빈 값 여러 개를 삽입합니다. 이렇게 하면 자동 증분 ID가 순차적으로 할당됩니다.
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into reservingAutoIncrementDemo values(),(),(),();
Query OK, 4 rows affected (0.15 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select *from reservingAutoIncrementDemo;
+--------+
| UserId |
+--------+
| 1 |
| 2 |
| 3 |
| 4 |
+--------+
4 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
여기서 중요한 점은 ROLLBACK을 실행해도 이미 할당된 자동 증분 값은 되돌아가지 않는다는 것입니다. 즉, 이 트랜잭션에서 사용된 ID(1~4)는 사실상 '예약'되어 다른 세션이 재사용할 수 없게 됩니다.
예약된 자동 증분 값 확인하기
이제 LAST_INSERT_ID() 함수를 변수에 저장하여 마지막으로 할당된 자동 증분 값을 확인할 수 있습니다.
mysql> SELECT LAST_INSERT_ID() INTO @IncrementedValue;
Query OK, 1 row affected (0.00 sec)
저장된 변수 값을 조회해 보겠습니다.
mysql> select @IncrementedValue;
실행 결과는 다음과 같습니다.
+-------------------+
| @IncrementedValue |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
정리
이 기법은 부모 레코드를 저장하기 전에 자식 테이블에서 사용할 ID를 미리 확보해야 하는 경우 등에 유용하게 활용할 수 있습니다. 다만 롤백된 ID는 영구히 소실되므로, ID 연속성이 중요한 시스템이라면 이 점을 반드시 고려해야 합니다.