以下のテーブルのようなENUM列がある列にNOT NULLを設定しPKを設定
した場合にどのくらいのデータが入るか確認。


CREATE TABLE `Country001` (
`Code` char(2) NOT NULL DEFAULT '',
`Continent` enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia',
PRIMARY KEY (`Continent`)
) ENGINE=MyISAM DEFAULT CHARSET=UTF8;

mysql> CREATE TABLE `Country001` (
-> `Code` char(2) NOT NULL DEFAULT '',
-> `Continent` enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia',
-> PRIMARY KEY (`Continent`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=UTF8;

Query OK, 0 rows affected (0.01 sec)

mysql> desc Country001;
+———–+—————————————————————————————+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———–+—————————————————————————————+——+—–+———+——-+
| Code | char(2) | NO | | | |
| Continent | enum(‘Asia’,’Europe’,’North America’,’Africa’,’Oceania’,’Antarctica’,’South America’) | NO | PRI | Asia | |
+———–+—————————————————————————————+——+—–+———+——-+
2 rows in set (0.01 sec)

mysql> insert into Country001 (Code,Continent) values('AAA','Asia');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into Country001 (Code,Continent) values('EEE','Europe');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into Country001 (Code,Continent) values('NNN','North America');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into Country001 (Code,Continent) values('NNN','Africa');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into Country001 (Code,Continent) values('NNN','Oceania');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into Country001 (Code,Continent) values('NNN','Antarctica');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into Country001 (Code,Continent) values('AAA','South America');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into Country001 (Code,Continent) values('AAA','South A');
Query OK, 1 row affected, 2 warnings (0.00 sec)

mysql>

country001

下記の列には、PKがありNULLを許容していないのでENUMのデータ7件とエラー時の空文字が入るので、
データとしては、最大8行のデータが入る。(ENUM+空文字)
enum(‘Asia’,’Europe’,’North America’,’Africa’,’Oceania’,’Antarctica’,’South America’)

country001_1

8行のデータ以外はもうInsertする事が出来ません。これは、PKの設定をせず、NULL
許容していないのでUNIQUE KEYをPK代わりに利用しても同じ結果になる。
t_enum

ストレージエンジンによる結果の違い

以下のINSERTはENUMに無い値を2ついれようとしているので、
空文字に変換された値が2つありPKエラーになっています。


CREATE TABLE `T_enum` (
`Col` enum('first','second','third') NOT NULL DEFAULT 'first',
PRIMARY KEY (`Col`)
) ENGINE=MyISAM DEFAULT CHARSET=UTF8;

MYISAM(エラーまでインサートされます)
enum


CREATE TABLE `T_enum` (
`Col` enum('first','second','third') NOT NULL DEFAULT 'first',
PRIMARY KEY (`Col`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

INNODB(トランザクション処理なので、エラーで処理がROLLBACKされてます)
enum_innodb


NULL, NOT NULL, DEFAULT, SET,ENUM,データ型などによる
Default値の変化について。


mysql> CREATE TABLE defaults (
-> id INT UNSIGNED NOT NULL UNIQUE,
-> col1 INT NULL,
-> col2 INT NOT NULL,
-> col3 INT DEFAULT 42,
-> col4 CHAR(5) NULL,
-> col5 CHAR(5) NOT NULL,
-> col6 CHAR(5) DEFAULT 'yoo',
-> col7 TEXT NULL,
-> col8 TEXT NOT NULL,
-> col9 TIME NOT NULL,
-> col10 DATE NULL,
-> col11 DATE NOT NULL,
-> col12 DATE DEFAULT '2002-02-08',
-> col13 ENUM('doo','yoo'),
-> col14 SET('blabla','yooyoo'),
-> col15 ENUM('doo','yoo') NOT NULL,
-> col16 SET('blabla','yooyoo') NOT NULL
-> );
Query OK, 0 rows affected (0.01 sec)

mysql> desc defaults;
+-------+------------------------+------+-----+------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------------+------+-----+------------+-------+
| id | int(10) unsigned | NO | PRI | NULL | |
| col1 | int(11) | YES | | NULL | |
| col2 | int(11) | NO | | NULL | |
| col3 | int(11) | YES | | 42 | |
| col4 | char(5) | YES | | NULL | |
| col5 | char(5) | NO | | NULL | |
| col6 | char(5) | YES | | yoo | |
| col7 | text | YES | | NULL | |
| col8 | text | NO | | NULL | |
| col9 | time | NO | | NULL | |
| col10 | date | YES | | NULL | |
| col11 | date | NO | | NULL | |
| col12 | date | YES | | 2002-02-08 | |
| col13 | enum('doo','yoo') | YES | | NULL | |
| col14 | set('blabla','yooyoo') | YES | | NULL | |
| col15 | enum('doo','yoo') | NO | | NULL | |
| col16 | set('blabla','yooyoo') | NO | | NULL | |
+-------+------------------------+------+-----+------------+-------+
17 rows in set (0.01 sec)

64

mysql> INSERT INTO defaults (id) VALUES (1);
Query OK, 1 row affected, 6 warnings (0.00 sec)

mysql> show warnings;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1364 | Field 'col2' doesn't have a default value |
| Warning | 1364 | Field 'col5' doesn't have a default value |
| Warning | 1364 | Field 'col8' doesn't have a default value |
| Warning | 1364 | Field 'col9' doesn't have a default value |
| Warning | 1364 | Field 'col11' doesn't have a default value |
| Warning | 1364 | Field 'col16' doesn't have a default value |
+---------+------+--------------------------------------------+
6 rows in set (0.00 sec)

mysql> select * from defaults\G
*************************** 1. row ***************************
id: 1
col1: NULL
col2: 0
col3: 42
col4: NULL
col5:
col6: yoo
col7: NULL
col8:
col9: 00:00:00
col10: NULL
col11: 0000-00-00
col12: 2002-02-08
col13: NULL
col14: NULL
col15: doo
col16:
1 row in set (0.00 sec)

mysql>

※データ型やNULL値を許容するかしないかにより値が変わる。
※TEXT型にはDefault値が利用出来ない。
※その他

def64

6.2.3.3. ENUM 型

ENUM 型は、テーブルの作成時にカラムの仕様で明示的に列挙された使用可能な
値のリストから、通常、値が選択される文字列オブジェクトです。

* 不正な値(使用可能な値のリストに含まれない文字列)を ENUM 型のカラムに挿入すると、
特殊なエラー値として、空の文字列が挿入される。この文字列は数値 0 を持つため、’通常’ の空の
文字列とは区別することができる(これについては後述)。

* ENUM 型が NULL として宣言されている場合、そのカラムでは NULL も正しい値となり、
デフォルト値は NULL になる。ENUM 型が NOT NULL として宣言されている場合は、
使用可能な値の最初の要素がデフォルト値として使用される。