MySQLのENUM型とNOT NULL:デフォルト値の挙動を具体例で解説
MySQLのENUM型におけるNOT NULLの役割
MySQLのENUM(列挙型)データ型では、NOT NULL制約を宣言するかどうかによって、値を指定せずにINSERTした場合のデフォルト値の挙動が変わります。
- NOT NULLを宣言しない場合:デフォルト値はNULLになります。
- NOT NULLを宣言した場合:ENUMで定義した最初の値が自動的にデフォルト値として設定されます。
それぞれのケースについて、実際のSQL実行例を見ていきましょう。
CASE 1:NOT NULLなし → NULLが格納されるケース
まず、通常のENUMカラムを持つテーブルを作成します。
mysql> create table DemoTable1(isMarried ENUM('YES','NO'));
Query OK, 0 rows affected (0.76 sec)次に、INSERT文で値を指定せずにレコードを追加します。
mysql> insert into DemoTable1 values();
Query OK, 1 row affected (0.18 sec)
SELECT文でテーブルの中身を確認してみましょう。
mysql> select *from DemoTable1;
実行結果は以下の通りです。
+-----------+
| isMarried |
+-----------+
| NULL |
+-----------+
1 row in set (0.00 sec)
このように、NOT NULLを宣言していないため、値を省略したレコードにはNULLが格納されました。
CASE 2:NOT NULLあり → 最初のENUM値が格納されるケース
続いて、ENUMカラムにNOT NULL制約を付けたテーブルを作成します。
mysql> create table DemoTable2 (isMarried ENUM('YES','NO') NOT NULL);
Query OK, 0 rows affected (0.57 sec)CASE 1と同様に、値を指定せずにレコードを挿入します。
mysql> insert into DemoTable2 values();
Query OK, 1 row affected (0.17 sec)
SELECT文で結果を確認します。
mysql> select *from DemoTable2;
実行結果は以下のようになります。
+-----------+
| isMarried |
+-----------+
| YES |
+-----------+
1 row in set (0.00 sec)
今回はNULLではなく、ENUMで定義した最初の値「YES」が格納されました。これは、NOT NULL制約があるカラムにNULLを設定できないため、MySQLが暗黙のデフォルト値として先頭の列挙値を採用するからです。
まとめ
ENUM型カラムのデフォルト挙動を整理すると以下の通りです。
| 定義方法 | 値省略時のデフォルト値 |
|---|---|
| NOT NULLなし | NULL |
| NOT NULLあり | ENUMの最初の値 |
意図しないデータが入らないよう、ENUMカラムを設計する際はNOT NULLの有無と、列挙値の並び順(最初の値がデフォルトになる点)に注意しましょう。
-
JavaのPreparedStatementを使ってMySQLテーブルを更新する方法
JavaからMySQLのテーブルを更新するには、PreparedStatementを使用するのが一般的で安全な方法です。PreparedStatementを使うことで、SQLインジェクションを防ぎつつ、パラメータを動的に設定できます。この記事では、実際にテーブルを作成し、Javaプログラムからレコードを更新するまでの一連の手順を解説します。1. テーブルの作成まず、MySQLで更新用のテーブルを作成しましょう。mysql> create table DemoTable( Id int, FirstName varchar(40) ); Query OK, 0 rows a
-
MySQLでTIMESTAMP型のカラムを持つテーブルを作成する方法
MySQLでは、TIMESTAMPキーワードを使用することで、日時を自動的に記録するカラムを持つテーブルを簡単に作成できます。TIMESTAMP型に「DEFAULT CURRENT_TIMESTAMP」を指定すると、レコード挿入時の現在日時が自動的に設定されるため、作成日時や更新日時の管理に非常に便利です。1. TIMESTAMPカラムを持つテーブルを作成するまず、CREATE TABLE文でTIMESTAMP型のカラムを含むテーブルを作成します。mysql> create table demo50 -> ( -> id int not null auto_increment