以下のテーブルのような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

Comments are closed.

Post Navigation