MySQL:IDを生成する方法

2020年1月11日

テーブルとは無関係に1から始まる連番値を生成させたい。Firebirdにはこの機能がある。以下に説明がある。

要するに、DB内に存在するスレッドセーフな変数値であり、「現在の値を1インクリメント」とすれば、連番値が取得できる仕組みだ。しかし、MySQLにはこの機能が存在しない。どうすればいいのか?

DBとは無関係に保持する

もちろん、DBと関係なく、例えばテキストファイルに保持しておき、それをメンテする方法が考えられるのだが、この方法はだれもが不安に思うだろう。さらに、データベースバックアップを行った場合でも、それを同時に持っていかないとおかしなことになる。この方法は却下。どうしてもDB内に保存しておきたい。

別途AUTO_INCREMENT付のテーブルを作成する

create table sample (id auto_increment primary key, foo integer)

などというテーブルを作成しておき、このレコードを「insert into sample (foo) values (1)」などと挿入していくと、idの値が勝手に増加していく。これを取得した後でレコードを削除してしまう。これはうまく行くようだ。

  • レコードを削除した後で、そのidが再利用されることは無い。
  • 強制的にidを100などと指定して挿入すると、次は101からカウントされる。
  • さらに、トランザクションをロールバックしても、その値が再利用されることは無い

これはまぁまぁ良さそうだが、必要なジェネレータの数=無駄なテーブルの数となってしまう。

MariaDB 10.3のSequenceを使う

MariaDBには10.3からほぼOracle互換のSequenceが用意されているそうだ。

参考