MySQLのENUM型に割り当てられるインデックス値を確認する方法
実は、ENUM列の定義に記述した各要素には、1から始まるインデックス番号が自動的に割り当てられています。ここでいう「インデックス」とは、列挙値リストの中での位置(何番目か)を指すものであり、テーブルに作成するインデックスとはまったく関係がない点に注意してください。
この記事では、具体的な例を通じて、MySQLのENUM型の各要素にインデックス値が存在することを確認する3つの方法を紹介します。
方法1:列挙値の代わりにインデックス番号で挿入する
ENUM列へのデータ挿入時には、実際の列挙値を書く代わりに、そのインデックス番号を指定することもできます。例えば、以下のようなテーブルには「pass」と「fail」という2つのENUM値があるとします。リスト上で先に書かれた「pass」にはインデックス番号「1」が、「fail」には「2」が割り当てられています。そのため、次のようにインデックス番号を使って挿入することが可能です。
mysql> Insert into marks(id,name,result)values(103,'Daksh','1'); Query OK, 1 row affected (0.06 sec) mysql> Insert into marks(id,name,result)values(104,'Shayra','2'); Query OK, 1 row affected (0.07 sec) mysql> Select * from marks; +-----+---------+--------+ | id | Name | Result | +-----+---------+--------+ | 101 | Aarav | Pass | | 102 | Yashraj | Fail | | 103 | Daksh | Pass | | 104 | Shayra | Fail | +-----+---------+--------+ 4 rows in set (0.00 sec)
上記のクエリでは、「pass」に対してインデックス番号1、「fail」に対してインデックス番号2を使用しています。結果を見ると、それぞれ正しい列挙値が格納されていることがわかります。
方法2:空文字列のインデックス値を確認する
ENUMにおける空文字列のインデックス値は0です。ただし、空文字列を挿入する前に、SQLモードがTRADITIONAL、STRICT_TRANS_TABLES、STRICT_ALL_TABLESのいずれにも設定されていないことを確認してください。厳格モードが有効な場合、無効な値の挿入はエラーになります。以下の手順で動作を確認できます。
まず、SQLモードを空に設定し、空文字列を挿入してみます。
mysql> SET SESSION sql_mode = ''; Query OK, 0 rows affected (0.00 sec) mysql> Insert into marks(id, name, result) values(105,'Yashraj',''); Query OK, 1 row affected, 1 warning (0.06 sec)
このクエリでは、列挙値の代わりに空文字列が挿入されます。MySQLは次のような警告を出しながら挿入を実行します。
mysql> Show warnings; +---------+------+---------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------+ | Warning | 1265 | Data truncated for column 'Result' at row 1 | +---------+------+---------------------------------------------+ 1 row in set (0.00 sec)
テーブルの内容を確認すると、ENUMフィールドに空文字列が格納されていることがわかります。さらに、「result + 0」という数値演算を行うことで、各値に対応するインデックス番号を表示できます。
mysql> Select * from marks; +-----+---------+--------+ | id | Name | Result | +-----+---------+--------+ | 101 | Aarav | Pass | | 102 | Yashraj | Fail | | 103 | Daksh | Pass | | 104 | Shayra | Fail | | 105 | Yash | | +-----+---------+--------+ 5 rows in set (0.00 sec) mysql> Select result+0 As result_index from marks; +--------------+ | result_index | +--------------+ | 1 | | 2 | | 1 | | 2 | | 0 | +--------------+ 5 rows in set (0.01 sec)
上記の出力結果から、空文字列のインデックス値が0であることが明確に確認できます。
方法3:NULLのインデックス値を確認する
ENUM列にNOT NULL制約を指定していない場合、列挙値の代わりにNULLを挿入することも可能です。NULLのインデックス値はNULL自体です。次の例では、「result」テーブルのENUM列にNULLを挿入し、そのインデックス値を確認します。
mysql> Create table result(Id INT PRIMARY KEY NOT NULL, Name Varchar(10), Grade ENUM('POOR','GOOD'));
Query OK, 0 rows affected (0.25 sec)
mysql> Insert into result(id, name, grade) values(100, 'Rahul', NULL);
Query OK, 1 row affected (0.06 sec)上記のクエリにより、列挙値の代わりにNULLが挿入されました。テーブルの内容を確認してみましょう。
mysql> Select * from result; +-----+-------+-------+ | Id | Name | Grade | +-----+-------+-------+ | 100 | Rahul | NULL | +-----+-------+-------+ 1 row in set (0.00 sec)
続いて、次のクエリで数値演算を行うと、NULLのインデックス値がNULLであることが確認できます。
mysql> Select Grade+0 As Grade_index from result; +-------------+ | Grade_index | +-------------+ | NULL | +-------------+ 1 row in set (0.00 sec)
まとめ
MySQLのENUM型では、列挙値には1から始まるインデックス番号が割り当てられます。特別な値としては、空文字列のインデックスは0、NULLのインデックスはNULLとなります。「列挙値 + 0」という演算を使えば、格納されている値がどのインデックス番号に対応するのかを簡単に確認できるので、デバッグやデータ検証の際にぜひ活用してください。
-
MySQLのSELECT文で列の値を2回表示する方法
MySQLのSELECT文で列の値を2回表示する方法 MySQLでSELECT文の結果として、同じ列の値を2回表示したい場合はconcat()関数を使うのが簡単です。ここでは、サンプルテーブルを作成しながら、実際に値を連結して表示する手順を順番に解説します。 1. サンプルテーブルの作成 まず、テスト用のテーブルを作成しましょう。 mysql> create table DemoTable ( Value int ); Query OK, 0 rows affected (0.73 sec) 2. レコードの挿入 次に、insertコマンドを使っていくつかのレコードを追加します。
-
MySQLで特定のフィールドの値を入れ替える(スワップする)方法
MySQLで特定のフィールドの値を入れ替える方法MySQLでは、UPDATE文とユーザー定義変数を組み合わせることで、特定のレコードの2つのカラムの値を簡単に入れ替えることができます。この記事では、実際のサンプルコードと実行結果を使って、手順をわかりやすく解説します。1. テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Number1 in