AUTO_
今回はこのAUTO_
AUTO_INCREMENTについて
AUTO_
mysql> CREATE TABLE t0 (
id INT PRIMARY KEY ,
id2 INT AUTO_INCREMENT,
KEY(id2)
);
Query OK, 0 rows affected (0.03 sec)
また、
- SHOW CREATE TABLE文から確認
- information_
schema. tablesテーブルのauto_ incrementカラムから確認 - sys.
schema_ auto_ increment_ columnsビューのauto_ incrementカラムを確認
AUTO_INCREMENTに関するオプション
以下のようなオプションがあります。
| オプション名 | デフォルト値 | 内容 |
|---|---|---|
| auto_ |
1 | 指定した数値分だけAUTO_ |
| auto_ | 1 | 指定した数値からAUTO_ |
| group_ | 7 | グループレプリケーション環境下にて、 |
| innodb_ | 1 | 後述 |
auto_とauto_は通常に使っていれば変更することはないでしょう。マルチマスターを構成する際に、
データ型による違い
最大値はデータ型に依存します。SIGNED属性ではなくUNSIGNED属性を使用することで、
| 型 | SIGNEDの最大値 | UNSIGNEDの最大値 |
|---|---|---|
| TINYINT | 127 | 255 |
| SMALLINT | 32767 | 65535 |
| MEDIUMINT | 8388607 | 16777215 |
| INT | 2147483647 | 4294967295 |
| BIGINT | 9223372036854775807 | 18446744073709551615 |
最大値に達した挙動は、
- 一意制約がある場合、
一意制約エラーとなり更新できません。 - 一意制約がない場合、
最大値が繰り返し挿入されるようになります。
しかし、18446744073709551615を明示的に指定すると挿入できますが、18446744073709551615 - 1の値が限界値となります。
BIGINT型以外
mysql> INSERT INTO t0 (id) values (null); ERROR 1062 (23000): Duplicate entry '65535' for key 'PRIMARY'
BIGINT型
mysql> INSERT INTO t0 (id) values (null); ERROR 1467 (HY000): Failed to read auto-increment value from storage engine
AUTO_INCロック
シーケンス番号を重複することなく振り分けるために、AUTO_というテーブルロックを取得します。これはトランザクションの間ずっとロックを保持するわけではなく、
よって、
innodb_パラメータを使用することで、AUTO_を制御することができます。モードの変更にはMySQLの再起動が必要です。
| 値 | モード | デフォルト |
|---|---|---|
| 0 | 従来ロックモード | |
| 1 | 連続ロックモード | ○ |
| 2 | インターリーブ ロックモード |
0 :従来ロックモード
このモードは下位互換のために残されているもので、AUTO_を取得する動作になります。
INSERT INTO t0 (id,id2,id3) VALUES (NULL,?,?),(NULL,?,?);
1:連続 ロックモード
デフォルトのロックモードです。挿入される行が事前に行数の把握できないINSERT..AUTO_を取得します。
事前に行数の把握できる単純挿入は、
2:インターリーブ ロックモード
これはすべての挿入する文に対してAUTO_を取得しません。そのため、
その他、
MySQL再起動時の挙動
AUTO_
SELECT MAX(AUTO_INCREMENTのカラム) FROM 対象テーブル for update;
よって、
ちなみに、
参考として、
AUTO_INCREMENTの値変更
現在の値を変更するには、ALTER TABLE .. AUTO_を実行します。以下はAUTO_
mysql> ALTER TABLE t0 AUTO_INCREMENT = 10000;
ただし、
まとめ
AUTO_