Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL auto_increment(정수)의 한계는 얼마일까? 데이터 타입별 최대값 총정리

MySQL auto_increment의 한계란?

MySQL에서 auto_increment 컬럼이 가질 수 있는 최대값은 해당 컬럼의 데이터 타입에 따라 결정됩니다. 즉, 정수형 타입이 표현할 수 있는 범위가 곧 auto_increment의 한계가 됩니다.

데이터 타입별로 저장할 수 있는 최대값은 다음과 같습니다.

데이터 타입최대값
TINYINT127
UNSIGNED TINYINT255
SMALLINT32,767
UNSIGNED SMALLINT65,535
MEDIUMINT8,388,607
UNSIGNED MEDIUMINT16,777,215
INT2,147,483,647
UNSIGNED INT4,294,967,295
BIGINT9,223,372,036,854,775,807
UNSIGNED BIGINT18,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조차 부족해질 수 있으므로, 설계 단계에서 데이터 증가량을 미리 고려하는 것이 중요합니다.