勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

MySQLにてUUIDを発行しプライマリキー(主キー)にする方法

  MySQL データベース

普段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ステートメント

https://dev.mysql.com/doc/refman/8.0/ja/table.html

 - MySQL データベース

  関連記事

MySQLにて直近のクエリで発行されたAUTO_INCREMENTの値を取得する方法

やりたかったことは「MySQLで新規登録(INSERT)なら、登録時のAUTO_ ...

MySQLでIPアドレスを数値として入れると変な値になる場合の対処方法

MySQLでIPアドレスをINET_ATON関数を用いてINT型に変換し格納する ...

mysqlで正規化できない時はシリアライズ使う

アンケートか何かに機能追加している際、配列を カンマ区切りで結合して文字列でDB ...

MySQLでテキスト(日本語、半角英数字)を暗号化・復号化する方法

MySQLでデータを登録する際に暗号化したいというケースがあった。対象のデータは ...

MySQLで同一サーバーの異なるDB内のテーブルをJOINする

同一のMySQLサーバーでdb1データベースのtable1テーブルと、db2デー ...