はじめに
以下のページのざっくり訳メモです。
MariaDB Documentation - AUTO_INCREMENT
Description
- 新規にレコードを追加するときにkeyの値を自動的に増やす仕組み
- defaultは1
- tableは1つだけAUTO_INCREMENTを設定したカラムを持つことができる
- それはkeyである必要があるが、PRIMARY KEYやUNIQUE KEYである必要はない
Setting or changing the auto_increment value
- tableにAUTO_INCREMENTを設定する方法は2つ
- ALTER TABLE
- insert_idというvalueにset
InnoDB/XtraDB
- 10.2.3まではauto-increment数はメモリに保管されており、serverを再起動すると数はtable内のもっとも高い値に設定される
- 10.2.4からはこの制約は解除され、AUTO_INCREMENTは永続的になる
-
AUTO_INCREMENT Handling in XtraDB/InnoDBも見るとよい
- 今更ですけどAUTO_INCREMENTってあるPKの次に設定される値で、どんどん大きくなるんですね。ON/OFFではなく。
Setting explicit values
- AUTO_INCREMENTの値は対象のkeyに存在してはいけない
- 新しい値は現在の最大値より大きくないといけない。
- もし現在の最大値より小さい値が挿入された場合はAUTO_INCREMENTは変化しない
例が分かりやすい。
Missing values
- AUTO_INCREMENTは欠損することがある
- 行が削除された場合やAUTO_INCREMENTが明示的に更新された場合、古い値は決して使われない
- 結果的に、AUTO_INCREMENTは時系列的に(昇順に)並ぶが、整数列にはならない
Replication
- galeraによるmalti-master replicationを安全に行うためにはAUTO_INCREMENTはauto_increment_incrementとauto_increment_offsetを使いクラスタ内でユニークな値を生み出す必要がある。
- auto_increment_increment ... AUTO_INCREMENTの増分(increment)
- auto_increment_offset ... AUTO_INCREMENTのオフセット
ここがキモ。OFFSETは開始位置で、INCREMENTが増分。multi-musterの場合は以下のように増えていかないといけない。
* maria1: 1 -> 4 -> 7 (INCREMENT=3, OFFSET=1)
* maria2: 2 -> 5 -> 8 (INCREMENT=3, OFFSET=2)
* maria3: 3 -> 8 -> 9 (INCREMENT=3, OFFSET=3)
CHECK constraints, DEFAULT values and virtual columns
- MariaDB 10.2.6以降ではauto_incrementカラムは以下の環境下では許可されない
- CHECK constraints .. カラムの制約条件のこと
- DEFAULT value expressions ... カラムのデフォルト値のこと
- virtual columns ... (計算式を入れたりする?)仮想カラム
- 10.2.4より低いバージョンでは許可されるが、うまく動かない可能性がある。詳細はMDEV-11117参照
ちょっとここはよくわかんなかったな。
おわりに
AUTO_INCREMENTの考え方がわかった。次はgaleraによるmulti-master replicationを行うときの動きについて、wsrep_auto_increment_controlを見ていく。