勉強したことのメモ

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で特定のテーブルにパーティショニング設定し高速化を図る方法

以前に他社が設計されたログ系のテーブルを拝見した際にパーティショニング設定が行わ ...

MySQLで指定の順にデータをソートする方法(ORDER BY FIELD)

MySQLで指定した順にソートしてデータを取り出したい。通常だと主キーだったり何 ...

MySQLで日時や日付で範囲検索する際に動作速度を向上させる方法

MySQLでログ系等の大量にデータが格納されているテーブルから日時や日付で範囲検 ...

ON DUPLICATE KEY UPDATE後にinsert_idを取得すると結果が0になる

MySQLでON DUPLICATE KEY UPDATE句指定し、データの登録 ...

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

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