勉強したことのメモ

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で「Incorrect integer value: '' for column」エラーの対応方法

MySQLで「Incorrect integer value: '' for c ...

MySQLのRANK及びDENSE_RANK関数を用いてランキングを実装する方法

ランキング機能を実装する際、上位〇位までのデータをMySQLから持ってきて順位付 ...

MySQLで特定カラムの
タグを改行コードに一括置換させる方法

MySQLで特定カラムの<br>タグを改行コードに一括置換したかった ...

MySQLのview(ビュー)で仮想的なテーブルを作成する方法

MySQL関連のサイトを見ているとview(ビュー)が云々という記事を見かけた。 ...

MySQLでtext型カラムに入っている数値をint型としてソートする

MySQLでtext型として指定されているカラムがあり、その中には文字列であった ...