読者です 読者をやめる 読者になる 読者になる

mysqlのauto incrementを調べてみる

auto incrementは勝手に連番を振ってくれる機能。 これがあれば、採番テーブルはいらない?

作成するためには、create tableするときにauto incrementをつけてあげればOK。

mysql> create table test (
    -> id int(2) NULL auto_increment,
    -> name varchar(20),
    -> primary key (id)
    -> );

あとはinsertするたびに増えていく。

mysql> insert into test(name) values ('test1');
Query OK, 1 row affected (0.09 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
+----+-------+
1 row in set (0.00 sec)

mysql>
mysql> insert into test(name) values ('test2');
Query OK, 1 row affected (0.10 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
+----+-------+
2 rows in set (0.00 sec)

auto incrementの次の値はinformation_schemaでみることができる。

mysql> show columns from information_schema.tables;
+-----------------+---------------------+------+-----+---------+-------+
| Field           | Type                | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| TABLE_CATALOG   | varchar(512)        | NO   |     |         |       |
| TABLE_SCHEMA    | varchar(64)         | NO   |     |         |       |
| TABLE_NAME      | varchar(64)         | NO   |     |         |       |
| TABLE_TYPE      | varchar(64)         | NO   |     |         |       |
| ENGINE          | varchar(64)         | YES  |     | NULL    |       |
| VERSION         | bigint(21) unsigned | YES  |     | NULL    |       |
| ROW_FORMAT      | varchar(10)         | YES  |     | NULL    |       |
| TABLE_ROWS      | bigint(21) unsigned | YES  |     | NULL    |       |
| AVG_ROW_LENGTH  | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_LENGTH     | bigint(21) unsigned | YES  |     | NULL    |       |
| MAX_DATA_LENGTH | bigint(21) unsigned | YES  |     | NULL    |       |
| INDEX_LENGTH    | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_FREE       | bigint(21) unsigned | YES  |     | NULL    |       |
| AUTO_INCREMENT  | bigint(21) unsigned | YES  |     | NULL    |       | ★
| CREATE_TIME     | datetime            | YES  |     | NULL    |       |
| UPDATE_TIME     | datetime            | YES  |     | NULL    |       |
| CHECK_TIME      | datetime            | YES  |     | NULL    |       |
| TABLE_COLLATION | varchar(32)         | YES  |     | NULL    |       |
| CHECKSUM        | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATE_OPTIONS  | varchar(255)        | YES  |     | NULL    |       |
| TABLE_COMMENT   | varchar(2048)       | NO   |     |         |       |
+-----------------+---------------------+------+-----+---------+-------+
21 rows in set (0.00 sec)

mysql> select AUTO_INCREMENT from information_schema.tables where table_name='test';
+----------------+
| AUTO_INCREMENT |
+----------------+
|              3 |
+----------------+
1 row in set (0.00 sec)

alterコマンドでauto incrementの次の値を変更可能

mysql> ALTER TABLE test AUTO_INCREMENT=10;
Query OK, 0 rows affected (0.14 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
mysql>
mysql> select AUTO_INCREMENT from information_schema.tables where table_name='test';
+----------------+
| AUTO_INCREMENT |
+----------------+
|             10 |
+----------------+
1 row in set (0.00 sec)

mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
+----+-------+
2 rows in set (0.00 sec)

mysql>
mysql> insert into test(name) values ('test3');
Query OK, 1 row affected (0.10 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
| 10 | test3 |
+----+-------+
3 rows in set (0.00 sec)

auto incrementの値におかしな設定は入れることができない。

mysql> ALTER TABLE test AUTO_INCREMENT=1;
Query OK, 0 rows affected (0.10 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
mysql>
mysql> select AUTO_INCREMENT from information_schema.tables where table_name='test';
+----------------+
| AUTO_INCREMENT |
+----------------+
|             11 |
+----------------+
1 row in set (0.00 sec)

mysql>
mysql>
mysql> insert into test(name) values ('test4');
Query OK, 1 row affected (0.13 sec)

mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
| 10 | test3 |
| 11 | test4 |
+----+-------+
4 rows in set (0.00 sec)

mysql>
mysql> ALTER TABLE test AUTO_INCREMENT=5;
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select AUTO_INCREMENT from information_schema.tables where table_name='test';
+----------------+
| AUTO_INCREMENT |
+----------------+
|             12 |
+----------------+
1 row in set (0.00 sec)

mysql> insert into test(name) values ('test5');
Query OK, 1 row affected (0.09 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
| 10 | test3 |
| 11 | test4 |
| 12 | test5 |
+----+-------+
5 rows in set (0.00 sec)