메뉴 건너뛰기

Korea Oracle User Group

DBMS

MySQL 8.0 Reference Manual - Tutorial - Creating and Using a Database4

3.6.9 Using AUTO_INCREMENT

 

AUTO_INCREMENT 속성은 새로운 row의 값의 유일성을 보장하기 위해 유니크한 값을 생성하는데 사용되어 진다.

 

mysql> CREATE TABLE animals (
    ->      id MEDIUMINT NOT NULL AUTO_INCREMENT,
    ->      name CHAR(30) NOT NULL,
    ->      PRIMARY KEY (id)
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO animals (name) VALUES
    ->     ('dog'),('cat'),('penguin'),
    ->     ('lax'),('whale'),('ostrich');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from animals;
+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+
6 rows in set (0.00 sec)

 

위에 보는 바와 같이 AUTO_INCREMENT 컬럼에 값을 넣지 않아도 MySQL이 자동으로 시퀀스 넘버를 넣어준다.

 

AUTO_INCREMENT 속성의 컬럼에 0 값을 지정할 수 있다.

SQL 모드를 NO_AUTO_VALUE_ON_ZERO로 설정하지 않고 0 값으로 insert 하게 되면 아래와 같은 결과를 확인할 수 있다.

 

mysql> INSERT INTO animals (id,name) VALUES(0,'groundhog');
Query OK, 1 row affected (0.01 sec)
mysql> select * from animals;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | dog       |
|  2 | cat       |
|  3 | penguin   |
|  4 | lax       |
|  5 | whale     |
|  6 | ostrich   |
|  7 | groundhog |
+----+-----------+
7 rows in set (0.00 sec)

 

즉, 자동으로 AUTO_INCREMENT된 값으로 insert 된다.

 

AUTO_INCREMENT 속성이 걸린 컬럼이 NOT NULL 속성을 가지고 있다면 아래와 같이 입력을 해도 증가된 시퀀스 값이 insert 된다.

 

mysql> INSERT INTO animals (id,name) VALUES(NULL,'squirrel');
Query OK, 1 row affected (0.02 sec)
mysql> select * from animals;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | dog       |
|  2 | cat       |
|  3 | penguin   |
|  4 | lax       |
|  5 | whale     |
|  6 | ostrich   |
|  7 | groundhog |
|  8 | squirrel  |
+----+-----------+
8 rows in set (0.00 sec)

 

하지만 겹치는 값을 넣게 되면 위 테이블 생성시 primary key를 세팅한 이유로 겹친다고 에러가 발생하게 된다.

 

mysql> INSERT INTO animals (id,name) VALUES(8,'kwan');
ERROR 1062 (23000): Duplicate entry '8' for key 'PRIMARY'
mysql>

 

만약 AUTO_INCREMENT 속성을 가진 컬럼에 primary key 설정을 하지 않는 다면 아래와 같이 에러가 발생한다.

 

mysql> CREATE TABLE animals_test (
    ->      id MEDIUMINT NOT NULL AUTO_INCREMENT,
    ->      name CHAR(30) NOT NULL
    -> );
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
mysql>

 

AUTO_INCREMENT 속성의 컬럼에 값을 지정한체 insert 하게 되면 중복되지 않는 한 값이 들어가게 되고 시퀀스는 리셋되며 다음값은 컬럼의 값중 가장 큰 값 다음 값으로 설정이 된다.

 

mysql> INSERT INTO animals (id,name) VALUES(100,'rabbit');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO animals (id,name) VALUES(NULL,'mouse');
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM animals;
+-----+-----------+
| id  | name      |
+-----+-----------+
|   1 | dog       |
|   2 | cat       |
|   3 | penguin   |
|   4 | lax       |
|   5 | whale     |
|   6 | ostrich   |
|   7 | groundhog |
|   8 | squirrel  |
| 100 | rabbit    |
| 101 | mouse     |
+-----+-----------+
10 rows in set (0.00 sec)

 

데이터 입력에 AUTO_INCREMENT 속성에 대한 값을 꼬여서 들어가게 해도 위에 언급했던 

원칙대로 데이터가 입력이 된다.

 

mysql> INSERT INTO animals (id,name) VALUES(110,'k');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO animals (id,name) VALUES(NULL,'kk');
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM animals;
+-----+-----------+
| id  | name      |
+-----+-----------+
|   1 | dog       |
|   2 | cat       |
|   3 | penguin   |
|   4 | lax       |
|   5 | whale     |
|   6 | ostrich   |
|   7 | groundhog |
|   8 | squirrel  |
| 100 | rabbit    |
| 101 | mouse     |
| 110 | k         |
| 111 | kk        |
+-----+-----------+
12 rows in set (0.00 sec)
mysql> INSERT INTO animals (id,name) VALUES(105,'kkk');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO animals (id,name) VALUES(NULL,'kkkk');
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM animals;
+-----+-----------+
| id  | name      |
+-----+-----------+
|   1 | dog       |
|   2 | cat       |
|   3 | penguin   |
|   4 | lax       |
|   5 | whale     |
|   6 | ostrich   |
|   7 | groundhog |
|   8 | squirrel  |
| 100 | rabbit    |
| 101 | mouse     |
| 105 | kkk       |
| 110 | k         |
| 111 | kk        |
| 112 | kkkk      |
+-----+-----------+
14 rows in set (0.00 sec)

 

update를 통해 값을 변경해도 시퀀스에 사용된 최대 값이 별도로 저장되어 있기 때문에 다음 값을 지정하게 된다.

 

mysql> update animals set id = 106 where name = 'kkkk';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> INSERT INTO animals (id,name) VALUES(NULL,'kkkkk');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM animals;
+-----+-----------+
| id  | name      |
+-----+-----------+
|   1 | dog       |
|   2 | cat       |
|   3 | penguin   |
|   4 | lax       |
|   5 | whale     |
|   6 | ostrich   |
|   7 | groundhog |
|   8 | squirrel  |
| 100 | rabbit    |
| 101 | mouse     |
| 105 | kkk       |
| 106 | kkkk      |
| 110 | k         |
| 111 | kk        |
| 113 | kkkkk     |
+-----+-----------+
15 rows in set (0.00 sec)

 

AUTO_INCREMENT 값을 1이 아닌 다른 값으로 설정하려면 아래의 명령어를 통해 변경할 수 있다.

 

ALTER TABLE tbl AUTO_INCREMENT = 100;

 

 

번호 제목 글쓴이 날짜 조회 수
19 PostgreSQL 16 설치하기(Installation) [1] 명품관 2024.01.24 1695
18 Top-Rated PostgreSQL GUI Clients for Windows 명품관 2023.05.10 252
17 기동시 "Job for mysqld.service failed because the control process exited with error code." 에러로 기동 실패 명품관 2020.09.03 8820
16 MySQL 8.0 Reference Manual - MySQL Server Administration2 - Server Configuration Validation 명품관 2020.04.17 1490
15 MySQL 8.0 Reference Manual - MySQL Server Administration1 - Configuring the Server 명품관 2020.03.05 9810
» MySQL 8.0 Reference Manual - Tutorial - Creating and Using a Database4 명품관 2020.03.03 432
13 MySQL 8.0 Reference Manual - Tutorial - Creating and Using a Database3 명품관 2020.03.02 633
12 Windows 버전 MySQL의 my.ini 파일 찾기 file 명품관 2020.03.01 14370
11 MySQL 8.0 Reference Manual - Tutorial - Creating and Using a Database2 명품관 2020.02.29 381
10 MySQL 8.0 Reference Manual - Tutorial - Creating and Using a Database1 명품관 2020.02.28 341
9 MySQL 8.0 Reference Manual - Tutorial - Entering Queries 명품관 2020.02.28 335
8 MySQL 8.0 Reference Manual - Tutorial - Connecting to and Disconnecting from the Server 명품관 2020.02.27 382
7 MySQL Admin - 01 명품관 2019.10.08 835
6 How to Install MariaDB 10 on RHEL 8 [2] 명품관 2019.01.31 321
5 MySQL 설치 후 외부 접속 허용하기 명품관 2016.09.09 2971
4 CentOS 6.7 에서 MySQL 5.7 설치 명품관 2016.09.09 13946
3 티베로 trace log 중 ERROR_PSM_COMPILE_FAILED 에러란 명품관 2016.09.06 12035
2 DP, DPL, DPI에 관한trace log 내용 분석 명품관 2016.09.06 1262
1 티베로 에러 내용 확인 방법 명품관 2016.08.26 11025
위로