MySQL + phpMyAdminのデータベースでAUTO_INCREMENTを使ってみる

## はじめに
`PHP`の勉強しているときに`phpMyAdmin`で管理してる`MySQL`のデータベースには`AUTO_INCREMENT`という便利機能があることを知った。
早速、やってみよう!!

## AUTO_INCREMENTとは
簡単に言えば、自動割り当て。
カラムでの値を指定しなければ`MySQL`が自動で整数を割り当ててくれる。
1,2しか入ってないカラムなら`AUTO_INCREMENT`では3が割り当てられる。

## MySQL + phpMyAdminのデータベースでAUTO_INCREMENTを使ってみる
### データベース初期設定
まずは`phpMyAdmin`で新規データベース、テーブルの作成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/58e40b3e-34b7-7583-242b-e34f8d798c4d.png">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/7af8835d-a1b3-ff91-8b4c-00c6d8e20e68.png">
カラムの設定はこんな感じに(4つもいらなかった…)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/3d17181c-cc11-92ba-397f-027a05b8779b.png" height="300px">
とりあえずコードを書いたときにデータベースに接続できてるか確認するために適当なデータ挿入
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/4b0ec142-62da-1b4d-069d-b67e2124c57c.png" width="700px">
今回は使わないけど、主キーをつける癖は付けといた方が良いよね
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/ed0e2ba0-b438-2bff-61c3-1afe20618453.png" width="700px">

データベースの設定はこんなもんかな

### ファイル作成
今回必要なファイルは3つ

- `example`テーブルのデータ一覧を表示するファイル = `list.php`
- `example`テーブルに追加するデータを記述するファイル = `add_data.php`
- `example`テーブルにデータを追加するファイル = `add_data_finish.php`

#### list.php
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/257cfb2a-b3f6-c8d8-a733-32ef564641dc.png">

```list.php
<?php
	function php_code(){
		$db_link = mysqli_connect('localhost',ユーザー,パスワード,'auto_increment');
		//MySQLに接続
		$get_data = "SELECT * FROM example ORDER BY id;";
		//exampleテーブルからデータを昇順で取得するクエリ
		if($result = mysqli_query($db_link,$get_data)){
		//クエリの実行
			foreach ($result as $row) {
				echo '<tr>';
				echo '<td>'.$row['id'].'</td>';
				echo '<td style="text-align: center;">'.$row['name'].'</td>';
				echo '<td style="text-align: center;">'.$row['comment'].'</td>';
				echo '<td>'.$row['days'].'</td>';
                echo '</tr>';
                //<tr>はこのループ内に記入しないとデータが一列で表示されるので注意
			}
		}
	}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>データ一覧</title>
</head>
<body>
	<h2>データ一覧</h2>
	<table>
		<tr>
			<th>ID</th>
			<th>NAME</th>
			<th>COMMENT</th>
			<th>DAYS</th>
		</tr>
		<?php php_code()?>
	</table>
	<br/>
	<a href="add_data.php">データを追加する</a>
</body>
</html>
```

#### add_data.php
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/ef10443b-c0cd-d873-4991-12fe0867d34a.png">

```add_data.php
<?php 
	date_default_timezone_set('Asia/Tokyo');
	$days = date("Y/m/d H:i:s");
 ?>

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>データ追加</title>
</head>
<body>
	 <h2>データ追加</h2>
	 <form action="add_data_finish.php" method="post">
	 	<p>ID<p>
	 	<input type="text" name="add_id" required>
	 	<p>NAME<p>
	 	<input type="text" name="add_name" required>
	 	<p>COMMENT<p>
	 	<input type="text" name="add_comment" required>
	 	<p>DAYS</p>
	 	<p><?php echo $days; ?></p>
	 	<input type="hidden" name="add_days" value="<?php echo $days; ?>">
	 	<input type="submit" value="登録">
	 </form>
	 <br/>
	 <a href="list.php">データ一覧へ</a>
</body>
</html>
```

#### add_data_finish.php
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/f74abdc8-48cc-7350-4cbd-eb5780353d5a.png">

```add_data_finish.php
<?php 
	$db_link = mysqli_connect('localhost',ユーザー,パスワード,'auto_increment');

	$add_id = $_POST['add_id'];
	$add_name = $_POST['add_name'];
	$add_comment = $_POST['add_comment'];
	$add_days = $_POST['add_days'];
	$add_data = "INSERT INTO example VALUES ('$add_id','$add_name','$add_comment','$add_days');";
        //add_dataで記入したデータをexampleテーブルに渡すクエリ
	mysqli_query($db_link,$add_data);
 ?>

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>追加完了</title>
</head>
<body>
	 <h2>データを追加しました</h2>
	 <br/>
	 <a href="list.php">データ一覧へ</a>
</body>
</html>
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/7cc73de7-e4e8-cb02-f19c-9c08c6f5ffa3.png">
追加したデータが`list.php`の一覧に表示されてたらOK

### phpMyAdminでAUTO_INCREMENT設定
ここから本題
まずは`phpMyAdmin`で`AUTO_INCREMENT`を設定する
構造タブから`AUTO_INCREMENT`を有効にしたいカラムを選んで`変更`をクリック
今回は`id`を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/09d0dd41-1f5d-5e88-54fd-3b95a4b9fdda.png" width="700px">
画面が変わったら`A_I`の下のチェックボックスをクリックして、チェックをつけて`保存する`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/fdaf1b01-72a2-9842-27dd-928ebc3a7ac5.png" width="700px">
画面が変わって、指定したカラムの`その他`の列に`AUTO_INCREMENT`の文字があれば`phpMyAdmin`での作業は以上
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/f4dbd66d-2ce4-ec4e-446a-cfc900213165.png" width="700px">

### AUTO_INCREMENTを使用したPHPファイルを作成する
さっき作成したPHPファイルの中で`AUTO_INCREMENT`を使えるようにするのに操作する必要があるのは2つ。

- `add_data.php` → 次に自動割り当てされる数字を見つけ、`$_POST`に格納し送信できるようにする
- `add_data_finish.php` → `$add_data`クエリに`AUTO_INCREMENT`で`id`を自動割り当てしてくれるようにする

#### add_data.php
今回のように`AUTO_INCREMENT`が有効になっているカラムにデータを挿入する際、次に割り当てられる値を取得する必要がある。
現在のカラムに入っている最大値のデータを取得してそれに+1するのも解決策ではあるかもだけど、`4,5,6`みたいなデータがあったとき`6`が削除されれば、次に挿入される値は`5+1`の`6`になってしまう。
それなら両方で使える`AUTO_INCREMENT`を使えるようにしておいた方が良いよね。

実際のコードもそこまで大きな変化はないし、難しいことはやってない。
**`SHOW TABLE STATUS`**というテーブルの様々な情報が提示される構文を利用して、そこには次の`AUTO_INCREMENT`で割り当てられる値が格納されているのでその情報を取得すればいいだけ。

```add_data.php
<?php 
	date_default_timezone_set('Asia/Tokyo');
	$days = date("Y/m/d H:i:s");

	$db_link = mysqli_connect('localhost',ユーザー,パスワード,'auto_increment');
	$show_table = "SHOW TABLE STATUS LIKE 'example';";
	//userカラムに関する情報を取得
	if($result = mysqli_query($db_link, $show_table)){
		foreach ($result as $row) {
			$row['Auto_increment'];
			//AUTO_INCREMENTに関する情報を取得
            //最初が大文字であることに注意
		}
	}
	$add_id = $row['Auto_increment'];
 ?>
	<!-- 中略 -->

	 <h2>データ追加</h2>
	 <form action="add_data_finish.php" method="post">
	 	<p>ID<p>
	 	<?php echo $add_id; ?>
	 	<input type="hidden" name="add_id">
	 	<p>NAME<p>
	 	<!-- 以下略 -->

```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/339d56d6-5ec5-57eb-5e29-2a56005da618.png">

##### add_data_finish.php
このファイルで行うのは**`INSERT`**構文を使う時に、`AUTO_INCREMENT`が適用されるようにクエリに指定するだけ
`AUTO_INCREMENT`が適用されるのは、`AUTO_INCREMENT`が適用されているカラムに値が指定されなかったとき
だから、今回は`AUTO_INCREMENT`を指定している`id`に**`NULL`**を入れればいいだけ

```add_data_finish.php
<?php 
	$db_link = mysqli_connect('localhost',ユーザー,パスワード,'auto_increment');

	$add_name = $_POST['add_name'];
	$add_comment = $_POST['add_comment'];
	$add_days = $_POST['add_days'];
	$add_data = "INSERT INTO example VALUES ('NULL','$add_name','$add_comment','$add_days');";
    //AUTO_INCREMENTが適用されているidの挿入箇所にNULLを宣言
	mysqli_query($db_link,$add_data);
 ?>
 <!-- 以下略 -->
```

## おわりに
`AUTO_INCREMENT`が使えればコードの短縮にも繋がるし、色々考えなくていいのは楽。
今後もこういった機能を見つけてどんどん成長していこう!

## 参考文献

- [SHOW TABLE STATUS 構文 - MySQL :: MySQL 5.6 リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/show-table-status.html)
- [AUTO_INCREMENTを設定する(連続した数値を自動でカラムに格納する) | MySQLの使い方](https://www.dbonline.jp/mysql/table/index7.html)
- [MySQLのAUTO_INCREMENTについて色々と調べてみた。 - Qiita](https://qiita.com/sakuraya/items/0dd0bb4114e56f42556d)
- [【MySQL+PHP】AUTO_INCREMENTの次回値を取得する方法 | Life Tips](http://blog.kamabokonet.com/2013/06/22/%E3%80%90mysqlphp%E3%80%91auto_increment%E3%81%AE%E6%AC%A1%E5%9B%9E%E5%80%A4%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)