标签(空格分隔): MYSQL
对于ENUM数据类型,我们只能在给定的值的列表中取值。
创建一个players_small,拥有playerno,name,initials,birth_date,sex字段,sex字段值可以包含M 和 F
CREATE TABLE players_small(
playerno INTEGER NOT NULL PRIMARY KEY,
name CHAR(15) NOT NULL,
initials CHAR(3) NOT NULL,
birth_date DATE,
sex ENUM('M','F'))
小结:
在ENUM关键字后面,所有合法的值都被包含在括号中。最多可以指定65,536个值。上面的例子使用字符字面量指定值,但是也可以使用更复杂的表达式,所有的表达式必须是字符类型。
在指定了值的列表后,无法修改合法值列表;你可以删除表然后重建,或者删除字段然后重新添加。
给 players_small 添加一些数据
mysql> INSERT INTO players_small VALUES (24, 'Jones', 'P', '1985-04-22', 'M');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO players_small VALUES (25, 'Marx', 'L', '1981-07-01', 'F');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO players_small VALUES (111, 'Cruise', 'T', '1982-11-11', 'm');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO players_small VALUES(199, 'Schroder', 'L', '1970-02-12', 'X');
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
mysql> INSERT INTO players_small VALUES (201, 'Lie', 'T', '1972-02-12', NULL);
Query OK, 1 row affected (0.08 sec)
mysql> select * from players_small;
+----------+--------+----------+------------+------+
| playerno | name | initials | birth_date | sex |
+----------+--------+----------+------------+------+
| 24 | Jones | P | 1985-04-22 | M |
| 25 | Marx | L | 1981-07-01 | F |
| 111 | Cruise | T | 1982-11-11 | M |
| 201 | Lie | T | 1972-02-12 | NULL |
+----------+--------+----------+------------+------+
4 rows in set (0.00 sec)
小结:
ENUM 字段会自动把小写值转为大写
ENUM 字段不在合法值范围类会报错
ENUM 字段可以写入NULL
计算 sex * 1 的值
mysql> SELECT playerno,sex,sex * 1 from players_small;
+----------+------+---------+
| playerno | sex | sex * 1 |
+----------+------+---------+
| 24 | M | 1 |
| 25 | F | 2 |
| 111 | M | 1 |
| 201 | NULL | NULL |
+----------+------+---------+
4 rows in set (0.84 sec)
小结:
MYSQL并不存储M和F字面量,它给合法值列表赋予一个数字序列。第一个值为1,第二个值为2,以此类推。
给 players_small 按 sex 字段排序
mysql> SELECT playerno,sex,sex * 1 FROM players_small ORDER BY sex;
+----------+------+---------+
| playerno | sex | sex * 1 |
+----------+------+---------+
| 201 | NULL | NULL |
| 24 | M | 1 |
| 111 | M | 1 |
| 25 | F | 2 |
+----------+------+---------+
4 rows in set (0.06 sec)
小结:当存储和排序ENUM字段时,MYSQL使用内部值(数字序列)。有时候可能导致意外的结果。上面的列子中F在M前面,可是排序正好相反。因此,指定ENUM字段的值的顺序非常重要。
使用外键
另一种限制允许值的方法是创建一个只有一个字段的表来存储允许的值,值的一提的是,相对应的字段必须指定为外键。
创建单独的表限制 sex 字段取值
CREATE TABLE sexs(
sex CHAR(1) NOT NULL PRIMARY KEY
)
INSERT INTO sexs VALUES ('M'),('F')
CREATE TABLE players_small2(
playerno INTEGER NOT NULL PRIMARY KEY,
name CHAR(15) NOT NULL,
initials CHAR(3) NOT NULL,
birth_date DATE,
sex CHAR(1),
FOREIGN KEY (sex) REFERENCES sexs (sex) )
小结:上面的例子有两个好处
1. 使用标准SQL语句
2. 更容易扩展允许值的列表