# AUTO_INCREMENTをTiDBで使用する

### 概要
+ この演習では、TiDBにおけるカラム属性`AUTO_INCREMENT`についての経験を得ることができます。`AUTO_INCREMENT`属性をプライマリキーに持つテーブルを作成し、そのテーブルをクエリします。
+ TiDBの分散性が`AUTO_INCREMENT`属性の動作に及ぼす影響を簡単に観察できます。

 <img src="./diagram/2013E041_ja_001_20230407.png" width="60%" align="top"/>

### 注意
+ いくつかのステップでは、2つの異なるターミナルウィンドウでコマンドを入力する必要があります。2つのターミナルを起動し、演習の間ずっと開いておくと便利でしょう。
+ この演習で利用する、`IP`、`port`、`username`、`password`、`directory`などは、あなたの環境と異なる場合があります。
+ ターミナルウィンドウの"`$`"とはOSプロンプトです。
+ ターミナルウィンドウ内の "`tidb>`" または "`mysql>`" は、SQL コマンドプロンプトです。
+ これらの演習は、ノートパソコンなどの単一のマシン上で実行することができます。
+ この演習は、TiDB Playgroundクラスタのみに使用するようになっています。デモスクリプトを実行するために接続するTiDBサーバーインスタンスを完全にコントロールすることが必要です。一方、TiDB Cloudでは、フロントエンドのロードバランサーサービスがこれを処理します。

### 前提条件
+ macOSまたはLinuxを使用していること。
+ [lab repository](https://github.com/pingcap/tidb-course-201-lab.git)をクローン済みであること。
+ 演習「テスト用にTiDBクラスタを作成する」を完了していること。

### 所要時間
+ この演習は約15分程度かかります。

### タスク
1. デモスクリプトを確認し、理解します。
2. `AUTO_INCREMENT`属性が主キーで、`AUTO_ID_CACHE`が300ごとに増分する2つの新しいテーブルを作成します。
3. 複数のTiDBサーバーインスタンスからこれらのテーブルに値を挿入し、その後これらのインスタンスから挿入された値をクエリします。

### 手順
1. デモスクリプトをレビューして理解します。

     スクリプト `07-demo-auto-increment-01-setup.sh` は `07-demo-auto-increment-01-setup.sql` を呼び出し、同一の構成で `t1` と `t2` の2つのテーブルを作成します。
     ```
     $ cd tidb-course-201-lab/scripts
     $ cat ./07-demo-auto-increment-01-setup.sql
     ```
     ```sql
     /* source 07-demo-auto-increment-01-setup.sql */


     /* Setup: The schema for attribute AUTO_INCREMENT */
     DROP TABLE IF EXISTS test.t1;
     CREATE TABLE test.t1 (
         id INT PRIMARY KEY AUTO_INCREMENT,
         from_port CHAR(4))
         AUTO_ID_CACHE 300;


     DROP TABLE IF EXISTS test.t2;
     CREATE TABLE test.t2 (
         id INT PRIMARY KEY AUTO_INCREMENT,
         from_port CHAR(4))
         AUTO_ID_CACHE 300;
     ```

     スクリプト`07-demo-auto-increment-02-show.sh`は、同じTiDBサーバーインスタンス（ポート4000）から`07-demo-auto-increment-02-show.sql`を呼び出して、`t1`に4行を挿入し、その結果を確認します。
     ```
     $ cat ./07-demo-auto-increment-02-show.sql
     ```
     ```sql
     /* source 07-demo-auto-increment-02-show.sql */

     /* Populate test.t1 */
     INSERT INTO test.t1 (from_port) VALUES ('4000');
     INSERT INTO test.t1 (from_port) VALUES ('4000');
     INSERT INTO test.t1 (from_port) VALUES ('4000');
     INSERT INTO test.t1 (from_port) VALUES ('4000');

     /* Query 1: Check */
     SELECT id, from_port FROM test.t1;
     ```

     スクリプト`07-demo-auto-increment-03-show.sh`は、2つのTiDBサーバーインスタンス（ポート4000と4001で）から以下のスクリプトを呼び出して、`t2`に4つの行を挿入し、その後、結果を検証します。
     ```
     $ cat ./07-demo-auto-increment-03-show.sh
     #!/bin/bash

     # ./07-demo-auto-increment-03-show.sh

     echo INSERT via TiDB server 4000
     mysql -h 127.0.0.1 -P 4000 -u root < misc/insert-into-t2-4000-default.sql
     echo INSERT via TiDB server 4001
     mysql -h 127.0.0.1 -P 4001 -u root < misc/insert-into-t2-4001-default.sql
     mysql -h 127.0.0.1 -P 4000 -u root < misc/select-from-t2.sql
     ```
     ```
     $ cat ./misc/insert-into-t2-4000-default.sql
     ```
     ```sql
     INSERT INTO test.t2 (from_port) VALUES ('4000');
     INSERT INTO test.t2 (from_port) VALUES ('4000');
     ```
     ```
     $ cat ./misc/insert-into-t2-4001-default.sql
     ```
     ```sql
     INSERT INTO test.t2 (from_port) VALUES ('4001');
     INSERT INTO test.t2 (from_port) VALUES ('4001');
     ```
     ```
     $ cat misc/select-from-t2.sql
     ```
     ```sql
     SELECT * FROM test.t2;
     ```

2. デモスクリプトを実行して、結果を観察します。

     `AUTO_INCREMENT`の構成が同じ2つのテーブルを作成するには、セットアップスクリプトを実行します。
     ```
     $ ./07-demo-auto-increment-01-setup.sh
     ```

     スクリプト`07-demo-auto-increment-02-show.sh`を実行してテーブル`test.t1`をクエリし、表示された結果を確認します。 `test.t1`の前のINSERT文は同じTiDBサーバーインスタンスで実行されたため、オートインクリメントされたIDは連続しています。
     ```
     $ ./07-demo-auto-increment-02-show.sh
     INSERT via TiDB server 4000
     id      from_port
     1       4000
     2       4000
     3       4000
     4       4000
     ```

     ３番目のスクリプト `07-demo-auto-increment-03-show.sh` を実行し、表示された結果を確認します。 前の `INSERT` ステートメントが異なるTiDBサーバーインスタンスで実行されたため、自動インクリメントされたIDは連続していません。
     ```
     $ ./07-demo-auto-increment-03-show.sh
     INSERT via TiDB server 4000
     INSERT via TiDB server 4001
     id      from_port
     1       4000
     2       4000
     301     4001
     302     4001
     ```

3. 例の中の属性`AUTO_ID_CACHE`が300であることを思い出してください。これは、各TiDBサーバーインスタンスはオートインクリメントIDを300ずつ受け持っていることを意味します。

## 演習終わり

