MySQLでENUM型カラムを作成・使用する方法をわかりやすく解説
MySQLでは、あらかじめ定義した複数の候補値の中から1つだけを格納できるENUM型という便利なデータ型が用意されています。ENUMカラムを作成する際には、列挙する値を必ず引用符で囲まれた文字列リテラルとして指定する必要があります。
ENUMカラムを作成する基本構文
MySQLでENUMカラムを持つテーブルを作成するには、次のような構文を使用します。
CREATE TABLE table_name(
…
Col ENUM('Value1','Value2','Value3'),
…
);上記の構文では3つの列挙値を指定していますが、実際には65,535個までの要素を定義することが可能です。なお、ENUMの各値には内部的にインデックス番号(1から始まる整数)が割り当てられます。
具体例:ENUMカラムを持つテーブルの作成
それでは、「合格(Pass)」または「不合格(Fail)」のいずれかを保存するResultカラムを持つテーブルを作成してみましょう。
mysql> CREATE TABLE marks(id INT PRIMARY KEY NOT NULL, Name VARCHAR(255) NOT NULL, Result ENUM('Pass', 'Fail') NOT NULL);
Query OK, 0 rows affected (0.18 sec)このクエリを実行すると、ENUM型のフィールドを持つ「marks」というテーブルが作成されます。
データの挿入
作成したテーブルには、ENUMカラムに対して定義済みの値のみを挿入できます。以下のようにINSERT文を使ってレコードを追加します。
mysql> INSERT INTO marks(id, name, result) VALUES(101,'Aarav','Pass'); Query OK, 1 row affected (0.07 sec) mysql> INSERT INTO marks(id, name, result) VALUES(102,'Yashraj','Fail'); Query OK, 1 row affected (0.02 sec)
データの確認
SELECT文でテーブルの中身を確認してみましょう。
mysql> SELECT * FROM marks; +-----+---------+--------+ | id | Name | Result | +-----+---------+--------+ | 101 | Aarav | Pass | | 102 | Yashraj | Fail | +-----+---------+--------+ 2 rows in set (0.00 sec)
ENUM型を使うメリットと注意点
ENUM型を活用すると、ステータスや結果といった限られた選択肢のデータを効率的に管理できます。内部的には数値として扱われるため、VARCHAR型よりもストレージ容量を節約できる点も魅力です。
ただし、注意点もあります。許可されていない値を挿入しようとした場合、厳密モード(STRICTモード)ではエラーになり、非厳密モードでは空文字列(インデックス0)が代わりに格納されます。また、後から選択肢を追加したい場合はALTER TABLEによる変更が必要になるため、将来的に選択肢が増える可能性があるデータには、別途マスターテーブルを用意する設計も検討するとよいでしょう。
-
MySQLのCREATE TABLEクエリでCHAR_LENGTH()を使う方法
テーブル作成時にCHAR_LENGTH()を使用する MySQLでは、テーブル作成時にCHAR_LENGTH(カラム名)を使用することで、指定したカラムの文字数を自動的に計算して保存する「生成カラム(Generated Column)」を定義できます。これにより、データ挿入のたびに手動で文字数を数える必要がなくなります。 それでは、実際の例を見ながらテーブルを作成してみましょう。 mysql> create table DemoTable ( Id int NOT NULL AUTO_INCR
-
MySQLの単一クエリでCOUNT()とIF()を組み合わせる方法
はじめにMySQLでは、COUNT()関数とIF()関数を1つのクエリ内で組み合わせることで、特定の条件に一致するレコード数を効率的に集計できます。この記事では、ブール型(boolean)のカラムを持つテーブルを例に、「値が1であるレコードの総数」を取得する方法を段階的に解説します。1. サンプルテーブルの作成まず、boolean型のカラムを持つテーブルを作成します。mysql> create table DemoTable( isValidUser boolean);Query OK, 0 rows affected (0.70 sec)M