Mysql数据类型---ENUM

 
标签(空格分隔): 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. 更容易扩展允许值的列表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值