MySQLにてUUIDを発行しプライマリキー(主キー)にする方法
普段MySQLでプライマリキー(主キー)を使う場合、オートインクリメントを利用した連番IDを発行することが多い。ただ、連番ではなくランダムな英数字を設定したいケースがあった。衝突は避けたいので以前メモしたPHPでUUIDを発行しようかと思いきやMySQL側のみで対応できるみたい。以下に対応方法をメモ。
テーブル構造
mysql> SHOW COLUMNS FROM `test_table`; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | uuid | char(36) | NO | PRI | NULL | | | name | varchar(255) | NO | | NULL | | +-------+--------------+------+-----+---------+-------+
対応方法
SQL文
INSERT INTO `test_table` (`uuid`, `name`) VALUES (UUID(), '鈴木'), (UUID(), '佐々木'), (UUID(), '山田');
結果
mysql> TABLE `test_table`; +--------------------------------------+-----------+ | uuid | name | +--------------------------------------+-----------+ | 2966346f-a8a2-11ef-867f-00135d131a34 | 鈴木 | | 2966a280-a8a2-11ef-867f-00135d131a34 | 佐々木 | | 2966a609-a8a2-11ef-867f-00135d131a34 | 山田 | +--------------------------------------+-----------+
解説等
「UUID()」でバージョン1のUUIDが生成される。
また、結果のTABLE文だけどMySQL8.0.19から導入された構文で「SELECT * FROM `test_table`」と同じ結果が返ってくる。ただ、WHEREが利用できない点に注意。
所感
MySQLだけで完結できるのは助かる。尚、連番IDだと数値によるソートができたが、UUIDだとできないため生成日時(登録日時)も保存しておいた方が無難かと思われる。
リファレンス
UUID()
https://dev.mysql.com/doc/refman/8.0/ja/miscellaneous-functions.html#function_uuid
TABLEステートメント
関連記事
-
-
MySQLでオートインクリメントを使用せずにグループ毎に連番を設定する方法
MySQLでオートインクリメントを使用せずにグループ毎で連番を割り振りたかった。 ...
-
-
MySQLでJOINの高速化
JOINで無茶苦茶悩んだのでメモ。やりたかった事は、MySQLで テーブルAには ...
-
-
MySQLでスレッドの実行状況を表示しスレッドの経過時間チェックや特定スレッドを強制終了する方法
データベースサーバが重たく、原因を調査する機会があった。サーバ自体のメモリやCP ...
-
-
MySQLでデータの集計時に1日の起点を任意の時間に変更する方法
MySQLで1日毎の集計を行う際、例えば2020/01/01のデータは2020/ ...
-
-
MySQLでユーザー作成時にエラーが発生
SSHからrootアカウントでMySQLにログインし、ユーザーを作成しようとする ...