Posted at

MariaDBのAUTO_INCREMENTについて

More than 1 year has passed since last update.


はじめに

以下のページのざっくり訳メモです。

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を使いクラスタ内でユニークな値を生み出す必要がある。



ここがキモ。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カラムは以下の環境下では許可されない



  • 10.2.4より低いバージョンでは許可されるが、うまく動かない可能性がある。詳細はMDEV-11117参照

ちょっとここはよくわかんなかったな。


おわりに

AUTO_INCREMENTの考え方がわかった。次はgaleraによるmulti-master replicationを行うときの動きについて、wsrep_auto_increment_controlを見ていく。