MySQL:IDを生成する方法
テーブルとは無関係に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が用意されているそうだ。