auto_incrementのカラムにデータ投入すると次の値は?

表題の件について、どうなるんだっけ?と分からなくなってしまったので確認する。

■ 環境

  • MySQL 5.7.17

■ auto_increment

下記のテーブルを用意した。データはまだ投入していない。

mysql> show create table test;
+-------+-----------------------------------+
| Table | Create Table                      |
+-------+-----------------------------------+
| test  | CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-----------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> select * from test;
Empty set (0.01 sec)

mysql>

このテーブルに1件データを投入すると、”auto_increment“で”1“が投入される。

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

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

mysql>

この時の`auto_increment`の値は”2″になっていた。

mysql> show create table test;
+-------+-----------------------------------+
| Table | Create Table                      |
+-------+-----------------------------------+
| test  | CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 |
+-------+-----------------------------------+
1 row in set (0.00 sec)

mysql>

続いて”id“カラムに”3“を投入する。

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

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

mysql> show create table test;
+-------+-----------------------------------+
| Table | Create Table                      |
+-------+-----------------------------------+
| test  | CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 |
+-------+-----------------------------------+
1 row in set (0.00 sec)

mysql>

なるほど。”auto_increment“の値は必ず”最大値+1“以上になってくれるようである。

以上。

■ 確認

auto_incrementの現在値

MySQLについて表題を知りたい。該当のカラムの最大値を取れば良い?とか思ったがそれでは不確実である。

■ 環境

  • MySQL 5.7.17

■ show table status

mysql> show table status like 'test%' \G
*************************** 1. row ***************************
           Name: test
         Engine: InnoDB
  :
Auto_increment: 1320
  :
1 row in set (0.01 sec)

mysql>

`like`で対象を絞らないと全テーブルのステータスが取得できてしまう。

■ show create table

mysql> show create table test \G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  :
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1320 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)

mysql>

AUTO_INCREMENT=1320“が取得できる。他にも手段があるかもしれないが、この方法が簡単な気がする。

以上。

■ 関連

MySQLのコネクション数を取得

表題の通り。接続コネクション数がMaxConnectionsに達してエラーが出てしまった。その後、コネクション数を監視していて何が多く接続しているのかを確認したかった。

■ 環境

  • AWS RDS
  • MySQL 5.6.23

■ show processlist

下記で取得することができる。

mysql> show processlist;
+--------+----------+--------------------+--------------------+---------+-------+-------+------------------+
| Id     | User     | Host               | db                 | Command | Time  | State | Info             |
+--------+----------+--------------------+--------------------+---------+-------+-------+------------------+
|  31660 | rdsadmin | localhost:40321    | mysql              | Sleep   |     3 |       | NULL             |
  :
+--------+----------+--------------------+--------------------+---------+-------+-------+------------------+
18 rows in set (0.00 sec)

mysql>

rdsadmin“はRDSで起動しているからであろう。これは問題ない。それ以外のプロセスで”State“が”Sleep“で”Time“が異様に長いものは下記でプロセスを落としてしまう。

mysql> kill 137798;
Query OK, 0 rows affected (0.01 sec)

mysql>

以上。

■ 関連

select version();

MySQLにおいて表題の通り。稼働しているMySQLのversionが知りたかったのでメモ。

■ 環境

  • AWS RDS
  • MySQL 5.6.23

■ RDS

AWS RDSで稼働しているMySQLに接続して下記コマンドを実行する。

mysql> select version();
+------------+
| version()  |
+------------+
| 5.6.23-log |
+------------+
1 row in set (0.00 sec)

mysql>

これでversionが取得できる。

ちなみにヘルプを見てみると下記のようであった。

mysql> help version;
Name: 'VERSION'
Description:
Syntax:
VERSION()

Returns a string that indicates the MySQL server version. The string
uses the utf8 character set.

URL: http://dev.mysql.com/doc/refman/5.5/en/information-functions.html

Examples:
mysql> SELECT VERSION();
        -> '5.5.9-standard'

mysql>

以上。

■ 関連

MySQLでCSVを出力

表題の通り。ネットワーク越しにデータをCSV形式で出力したい時用のメモ。

■ 環境

  • MySQL

■ CSV

データの中に、”,“とかを含まない場合にのみ使える。AWSのRDSであったり、”INTO OUTFILE“が使えない環境で簡易にCSVにしたい場合に使ってる。

$ mysql -uroot -p --database=db --host=mysqlserver --batch -e "select * from test"
  | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > output.csv

普通にdumpした方が良いかもしれない…。が、まぁ時と場合によって使えるだろう。

以上。