PHPとMySQLでENUM型の取り得る値を取得する方法
MySQLデータベースに定義されたENUM型の列が取り得る値(選択肢)を確認したい場合、INFORMATION_SCHEMA.COLUMNSテーブルを参照することで簡単に取得できます。このテーブルにはデータベース内のすべてのテーブルや列のメタ情報が格納されており、COLUMN_TYPEカラムからENUMの定義そのものを文字列として取り出すことが可能です。
基本構文
ENUM型の候補値を取得するための基本的なSQL構文は以下の通りです。
SELECT
COLUMN_TYPE AS 任意の別名
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = 'データベース名'
AND TABLE_NAME = 'テーブル名'
AND COLUMN_NAME = 'ENUM列名';
サンプルテーブルの作成
動作を理解するために、まずENUM型の列を持つテーブルを作成しましょう。ここでは「sample」データベースに、色の候補を持つ次のテーブルを作成します。
mysql> CREATE TABLE EnumDemo (
-> Id INT,
-> Color ENUM('RED','GREEN','BLUE','BLACK','ORANGE')
-> );
Query OK, 0 rows affected (0.66 sec)
このテーブル「EnumDemo」は「sample」データベースに存在するものとします。それでは、上記の構文を実装して、Color列に設定されているすべてのENUM候補値を取得してみましょう。
実行例
クエリは以下のようになります。
mysql> SELECT
-> COLUMN_TYPE AS AllPossibleEnumValues
-> FROM
-> INFORMATION_SCHEMA.COLUMNS
-> WHERE
-> TABLE_SCHEMA = 'sample' AND TABLE_NAME = 'EnumDemo' AND COLUMN_NAME = 'Color';
出力結果
+---------------------------------------------+
| AllPossibleEnumValues |
+---------------------------------------------+
| enum('RED','GREEN','BLUE','BLACK','ORANGE') |
+---------------------------------------------+
1 row in set (0.00 sec)
このように、COLUMN_TYPEにはENUMの定義全体が enum('RED','GREEN','BLUE','BLACK','ORANGE') という形式の文字列として返されます。
PHPで取得した値を配列に変換する
返される結果は単なる文字列なので、PHP側で正規表現などを使って分解すると、プルダウンメニューなどで扱いやすい配列に変換できます。以下はPDOを使った実装例です。
<?php
$pdo = new PDO(
'mysql:host=localhost;dbname=sample;charset=utf8mb4',
'ユーザー名',
'パスワード'
);
$stmt = $pdo->prepare(
"SELECT COLUMN_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND COLUMN_NAME = ?"
);
$stmt->execute(['sample', 'EnumDemo', 'Color']);
$columnType = $stmt->fetchColumn();
// 例: enum('RED','GREEN','BLUE','BLACK','ORANGE')
// 正規表現で括弧の中身を抽出し、CSV形式として分割
preg_match("/^enum\((.*)\)$/i", $columnType, $matches);
$values = str_getcsv($matches[1], ',', "'");
print_r($values);
実行すると、次のように各候補値を要素とした配列が得られます。
Array
(
[0] => RED
[1] => GREEN
[2] => BLUE
[3] => BLACK
[4] => ORANGE
)
注意点
INFORMATION_SCHEMAを参照するには、対象データベースに対する適切な権限が必要です。COLUMN_TYPEはあくまで文字列として返されるため、フォームの選択肢などに利用する場合は上記のようにパース処理を行ってください。- ENUMの定義を変更した場合も、このクエリを実行し直せば常に最新の候補値を取得できます。
-
MySQLで特定の3つの値しか格納できないカラムを持つテーブルを作成する方法
MySQLで、あらかじめ決められた3つの値だけを格納できるカラムを持つテーブルを作成したい場合は、ENUMデータ型を使用します。ENUM型を使うと、指定した候補値以外のデータが挿入されるのを防ぐことができます。テーブルの作成まず、ENUM型のカラムを持つテーブルを作成しましょう。ここでは例として、「RED」「GREEN」「BLUE」の3色のみを許可するColorカラムを定義します。mysql> create table DemoTable838(Color ENUM(RED,GREEN,BLUE)); Query OK, 0 rows affected (0.67 sec)これで、Col
-
MySQLで別テーブルのIDからユーザー名を取得する方法|JOINの使い方を徹底解説
MySQLでは、別々のテーブルに保存されたデータをIDをキーに関連付けて取得したい場面が多くあります。そのような場合にはJOIN(内部結合)を使うことで、複数のテーブルを結合し、目的のユーザー名を簡単に取り出すことができます。 本記事では、実際にサンプルテーブルを作成しながら、JOINクエリの書き方をステップごとに解説します。 1つ目のテーブル「demo77」を作成する まず、ユーザーID(userid)とユーザー名(username)を格納するテーブルを作成します。useridは主キーとして設定します。 mysql> create table demo77 -> (