MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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の定義を変更した場合も、このクエリを実行し直せば常に最新の候補値を取得できます。
  1. 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

  2. MySQLで別テーブルのIDからユーザー名を取得する方法|JOINの使い方を徹底解説

    MySQLでは、別々のテーブルに保存されたデータをIDをキーに関連付けて取得したい場面が多くあります。そのような場合にはJOIN(内部結合)を使うことで、複数のテーブルを結合し、目的のユーザー名を簡単に取り出すことができます。 本記事では、実際にサンプルテーブルを作成しながら、JOINクエリの書き方をステップごとに解説します。 1つ目のテーブル「demo77」を作成する まず、ユーザーID(userid)とユーザー名(username)を格納するテーブルを作成します。useridは主キーとして設定します。 mysql> create table demo77 -> (