勉強したことのメモ

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

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

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

 - MySQL / MariaDB データベース

  関連記事

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

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

MySQLでdatetime型データの〇日後を取得する方法(DATEDIFF)
MySQLでdatetime型データの〇日後を取得する方法(DATEDIFF)

MySQLでdatetime型データがあり、何日経過しているかを取得し、〇日経過 ...

MySQLでLIKE検索時に大文字・小文字・半角・全角全て区別したい
MySQLでLIKE検索時に大文字・小文字・半角・全角全て区別したい

以前にMySQLであいまい検索時に大文字小文字は区別しないが、それ以外は全て区別 ...

異なるVPS間でMySQLの接続を行う方法
異なるVPS間でMySQLの接続を行う方法

異なるVPS間でMySQL接続を行った際のメモ。   対応方法 さくら ...

MySQLでデータの集計時に1日の起点を任意の時間に変更する方法
MySQLでデータの集計時に1日の起点を任意の時間に変更する方法

MySQLで1日毎の集計を行う際、例えば2020/01/01のデータは2020/ ...