MySQL auto_increment의 한계란?
MySQL에서 auto_increment 컬럼이 가질 수 있는 최대값은 해당 컬럼의 데이터 타입에 따라 결정됩니다. 즉, 정수형 타입이 표현할 수 있는 범위가 곧 auto_increment의 한계가 됩니다.
데이터 타입별로 저장할 수 있는 최대값은 다음과 같습니다.
| 데이터 타입 | 최대값 |
|---|---|
| TINYINT | 127 |
| UNSIGNED TINYINT | 255 |
| SMALLINT | 32,767 |
| UNSIGNED SMALLINT | 65,535 |
| MEDIUMINT | 8,388,607 |
| UNSIGNED MEDIUMINT | 16,777,215 |
| INT | 2,147,483,647 |
| UNSIGNED INT | 4,294,967,295 |
| BIGINT | 9,223,372,036,854,775,807 |
| UNSIGNED BIGINT | 18,446,744,073,709,551,615 |
예를 들어 TINYINT 타입을 사용하는 경우, auto_increment 값은 최대 127까지만 증가할 수 있으며 그 이상을 삽입하려고 하면 MySQL은 오류를 반환합니다.
1. 예제 테이블 생성하기
먼저 Id 컬럼을 auto_increment로 설정한 테이블을 생성해 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table LimitOfAutoIncrement
-> (
-> Id TINYINT NOT NULL AUTO_INCREMENT,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.68 sec)
2. 한계인 127개 레코드 삽입하기
TINYINT의 auto_increment 한계는 127이므로, 정확히 127개의 레코드를 삽입해 보겠습니다.
mysql> insert into LimitOfAutoIncrement values(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),();
Query OK, 127 rows affected (0.20 sec)
Records: 127 Duplicates: 0 Warnings: 0
3. 삽입된 레코드 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회하면 다음과 같습니다.
mysql> select *from LimitOfAutoIncrement;
실행 결과는 아래와 같으며, Id 값이 1부터 127까지 순차적으로 자동 증가한 것을 확인할 수 있습니다.
+-----+
| Id |
+-----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 20 |
| 21 |
| 22 |
| 23 |
| 24 |
| 25 |
| 26 |
| 27 |
| 28 |
| 29 |
| 30 |
| 31 |
| 32 |
| 33 |
| 34 |
| 35 |
| 36 |
| 37 |
| 38 |
| 39 |
| 40 |
| 41 |
| 42 |
| 43 |
| 44 |
| 45 |
| 46 |
| 47 |
| 48 |
| 49 |
| 50 |
| 51 |
| 52 |
| 53 |
| 54 |
| 55 |
| 56 |
| 57 |
| 58 |
| 59 |
| 60 |
| 61 |
| 62 |
| 63 |
| 64 |
| 65 |
| 66 |
| 67 |
| 68 |
| 69 |
| 70 |
| 71 |
| 72 |
| 73 |
| 74 |
| 75 |
| 76 |
| 77 |
| 78 |
| 79 |
| 80 |
| 81 |
| 82 |
| 83 |
| 84 |
| 85 |
| 86 |
| 87 |
| 88 |
| 89 |
| 90 |
| 91 |
| 92 |
| 93 |
| 94 |
| 95 |
| 96 |
| 97 |
| 98 |
| 99 |
| 100 |
| 101 |
| 102 |
| 103 |
| 104 |
| 105 |
| 106 |
| 107 |
| 108 |
| 109 |
| 110 |
| 111 |
| 112 |
| 113 |
| 114 |
| 115 |
| 116 |
| 117 |
| 118 |
| 119 |
| 120 |
| 121 |
| 122 |
| 123 |
| 124 |
| 125 |
| 126 |
| 127 |
+-----+
127 rows in set (0.00 sec)
4. 한계 초과 시 발생하는 오류
이제 auto_increment 값이 이미 최대치인 127에 도달했기 때문에 더 이상 새로운 레코드를 삽입할 수 없습니다. 이 상태에서 레코드를 추가하려고 하면 다음과 같은 오류가 발생합니다.
mysql> insert into LimitOfAutoIncrement values();
ERROR 1062 (23000): Duplicate entry '127' for key 'PRIMARY'
마무리 및 실무 팁
auto_increment의 한계는 곧 사용하는 정수형 데이터 타입의 최대 범위입니다. 따라서 대량의 데이터가 예상되는 테이블이라면 처음부터 충분히 큰 범위를 제공하는 INT UNSIGNED 또는 BIGINT 타입을 선택하는 것이 좋습니다. 특히 로그성 데이터나 트랜잭션이 많은 서비스에서는 INT조차 부족해질 수 있으므로, 설계 단계에서 데이터 증가량을 미리 고려하는 것이 중요합니다.