昨日の日記で、MySQL 8.0.23 で開放された INVISIBLE COLUMN(不可視列)について書きました。
sakaik.hateblo.jp
用途がよくわからない、といいつつ、最後に、「PKを不可視列にすれば、ちょっとだけINSERTが便利!」ということを発見したのですが、偶然ながらも、当たらずとも唐辛子といったところだったようです。
lefred さんのブログに説明がありました。
INVISIBLE COLUMN の話について書くと、「今まで、PKがなかったテーブルにAUTO_INCREMENT なPK列を追加する際に使うといいよ」ということでした。
PKのないテーブルが存在すること自体、あまり褒められたものではありませんが、まぁ色々事情はあるのでしょう。このテーブルに id列(integer primary key)を追加する場合、通常は先頭に列を追加したいでしょうから、そのテーブルの列位置が変わってしまいます。まぁこれで影響が出ちゃうクエリもあまり褒められたものじゃないとは思うのですが、理想より現実。とにかく問題が起きたら困るので、列位置が変わらない方法があるなら、それに超したことはありません。
こんな時に、追加する id列を不可視にすれば、影響なしなし無問題。
ALTER TABLE t1 ADD COLUMN id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY INVISIBLE FIRST;
べつに、このid列を使ってデータアクセスしたいわけではないので、不可視でいいのです。
lefredさんのブログには、明示的なPKが必要な理由や、PKがAUTO_INCREMENT であることをお勧めする理由が書かれていますので、興味ある方は読んでみるといいと思います。
私の理解の範囲で簡単にまとめると:
- PK がないテーブルは、MySQLが勝手に6バイトの内部的なPK列を作る
- しかし内部的なPK列は、触れないし見えない、つまりコントローラブルじゃない
- 内部的なPK列は全テーブル通しての連番(?)になるので、イケてない
- ランダムな文字列をPKにするのはお勧めしない。INSERTのたびに内部の配置換えが起こるから(クラスタド・インデックスなので)
- UUID() を UUID_TO_BIN してPKとして使うアイデアも、↑と同じ
- つまりは、intやbigintのAUTO_INCREMENT 最高!
私の勘違いや読み間違いをしている点があったら教えてください。
PKがないテーブルに対して、内部で勝手につけるPKが現在の仕様ではなく、INVISIBLE なAUTO_INCREMENT になってくれれば、それで良い気もしますが、今回はそこへ向けての伏線なのかもしれませんね。