메뉴 건너뛰기

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;

 

 

위로