勉強したことのメモ

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でdatetime型データの〇日後を取得する方法(DATEDIFF)

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

MySQLでROW_NUMBER関数を使用してグループ毎に連番を設定する方法

以前にMySQLでオートインクリメントを使用せずにグループ毎に連番を設定する方法 ...

PHPからMySQLにシリアライズしたデータを格納

アンケートフォームみたいなのがあって、 今後も定期開催し、尚且つ質問内容は増減す ...

MySQLで全角半角を区別せずに検索する方法(collate utf8_unicode_ci)

あるシステムでMySQLの検索時に「WHERE test_column coll ...

MySQLでストアドプロシージャ戻り値対応版であるストアドファンクションの設定と利用方法

先日MySQLのストアドプロシージャに関するメモを書いたが、今回はストアドファン ...