16.2 列表类型和数据完整性
1 数据类型
1.1 值类型
1.1.1 整型
类型
字节
范围
tinyint
1
-128~127
smallint
2
-32768~32767
mediumint
3
-8388608~8388607
int
4
-2^31^~2^31^-1
bigint
8
-2^63^~2^63^-1
1、无符号整数(unsigned):无符号数没有负数,正数部分是有符号的两倍。
例题
mysql> create table stu(
-> id smallint unsigned auto_increment primary key comment '主键',
-> age tinyint unsigned not null comment '年龄',
-> money bigint unsigned comment '存款'
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> desc stu;
+-------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| age | tinyint(3) unsigned | NO | | NULL | |
| money | bigint(20) unsigned | YES | | NULL | |
+-------+----------------------+------+-----+---------+----------------+
3 rows in set, 3 warnings (0.00 sec)2、整型支持显示宽度(最小的显示位数) 比如int(5),如果数值的位数小于5位,前面加上前导0。比如输入12,显示00012;大于5位就不添加前导0。
1.1.2 浮点型(保存近似值小数)
浮点型
占用字节
范围
float(单精度)
4
-3.4E+38~3.4E+38
double(双精度)
8
-1.8E+308~1.8E+308
1、浮点数声明: float(M,D) double(M,D)
M:总位数
D:小数位数
例题;
2、浮点的精度可能会丢失【精度指的是小数】

1.1.3 定点数
语法:decimal(M,D)
1.2 字符型
数据类型
描述
长度
char(长度)
定长
最大255
varchar(长度)
变长
最大65535
tinytext
大段文本
2^8^-1=255
text
大段文本
2^16^-1=65535
mediumtext
大段文本
2^24^-1
longtext
大段文本
2^32^-1
1、char(10)和varchar(10)的区别?
答:相同点:它们最多只能保存10个字符;
2、char的最大长度是255。 
3、varchar理论长度是65535字节,实际根本达不到。具体长度与字符编码有关。 

4、一个记录的总长度不能超过65535个字节。
5、大块文本(text)不计算在总长度中,一个大块文本只占用10个字节来保存文本的地址。 
1.3 枚举(enum)
1、从集合中选择一个数据(单选)
2、MySQL的枚举类型是通过整数来管理的,第一个值是1,第二个值是2,以此类推。

3、既然枚举在数据库内部存储的是整数,那么可以直接插入数字
枚举的优点:
1、 运行速度快(数字比字符串运算速度快)
2、 限制数据,保证数据完整性
3、 节省空间
1.4 集合(set)
从集合中选择一些数据(多选)
每个集合的元素都分配一个固定的数字,分配的方式从左往右按2的0、1、2、…次方

1.5 日期类型
数据类型
描述
datetime
日期时间,占用8个字节
date
日期 占用3个字节
time
时间 占用3个字节
timestamp
时间戳,占用4个字节
year
年份 占用1个字节
1.5.1 datetime
格式:年-月-日 小时:分钟:秒
1.5.2 date
1.5.3 timestamp
时间戳
timestamp类型和 datetime类型在表现上是一样的。他们的区别: datetime是从1到9999,而timestamp从1970年~2038年,2038年01月19日11:14:07秒以后就超出timestamp范围了。
1.5.4 year
因为只占用1个字节,最多只能表示255个年份,范围是1901-2155之间的年份
1.5.5 time
表示时间或时间间隔,范围是-838:59:59~838:59:59
多学一招:time支持以天的方式插入
1.6 boolean
MySQL不支持boolean类型,true和false在数据库中对应1和0。
1.7 关于数据类型的思考题
手机号码一般使用什么数据类型存储? char
电话号码使用什么数据类型 varchar
性别一般使用什么数据类型存储? char enum
学生年龄信息一般使用什么数据类型存储? tinyint
照片信息一般使用什么数据类型存储? binary
薪水一般使用什么数据类型存储? decimal
多学一招:一个字段到底选数字还是字符,取决于有没有计算的可能,如果没有计算的可能即使是数字也要用字符类型,比如手机号、QQ号,…
2 列属性
2.1 是否为空(null | not null)
null:可以为空
not null:不可以为空
思考题
学员姓名允许为空吗? 非空
家庭地址允许为空吗? 非空
电子邮件信息允许为空吗? 可以为空
考试成绩允许为空吗? 可以为空
2.2 默认值(default)
1、如果一个字段没有插入值,可以默认插入一个指定的值。
2、default关键字用来插入默认值
2.3 自动增长(auto_increment)
1、字段的值从1开始,每次递增1,特点就在字段中的数据不可能重复,适合为记录生成唯一的id
2、自动增长都是无符号整数。
3、在MySQL中,auto_increment必须是主键。但是主键不一定是自动增长的。
4、如果要给自动增长列插入数据,使用null关键字。
5、自动增长列上的数据被删除,默认情况下此记录的编号不再使用。

2.4 主键(primary key)
主键:唯一标识表中记录的一个或一组列
主键的特点:不能重复,不能为空
一个表只能有一个主键,主键可以有多个字段组成。
主键的作用:
1、 保证数据完整性
2、 加快查询速度
2.4.1 添加主键
方法一:创建表的时候添加主键
方法二:创建表的时候添加主键
方法三:更改表的时候添加主键
2.4.2 创建组合键

2.4.3 查看主键

2.4.4 删除主键

2.4.5 选择主键的原则
1、 最少性:尽量选择一个字段做主键
2、 稳定性:尽量选择更新少的列做主键
3、 尽量选择数字型的列做主键
2.4.6 主键思考题
1、在主键列输入的数值,允许为空吗? 不可以
2、 一个表可以有多个主键吗? 不可以
3、 在一个学校数据库中,如果一个学校内允许重名的学员,但是一个班级内不允许学员重名,可以组合班级和姓名两个字段一起来作为主键吗? 可以
4、 标识列(自动增长列)允许为字符数据类型吗? 不可以
5、 表中没有合适的列作为主键怎么办? 添加自动增加列
6、 如果标识列A的初始值为1,增长量为1,则输入三行数据以后,再删除两行,下次再输入数据行的时候,标识值从多少开始? 从4开始
2.5 唯一键
特点:
1、不能重复,可以为空
2、一个表可以有多个唯一键
作用:
1、 保证数据不能重复。保证数据完整性
2、 加快数据访问
2.5.1 添加唯一键
方法一:创建表的时候添加唯一键
还有一种方法
方法二:修改表的时候添加唯一键
一次添加多个唯一键
添加组合唯一键
2.5.2 查看唯一键
添加唯一键,给唯一键取名
2.5.3 删除唯一键
通过唯一键的名字来删除唯一键

问题:主键和唯一键的区别?
1、主键不能重复,不能为空,唯一键不能重复,可以为空
2、主键只有一个,唯一键可以有多个。
2.6 备注(comment)
为了程序员之间的相互交流 
3 SQL注释
单行注释:--或#
多行注释:/ /

4 数据完整性介绍

4.1 保证实体完整性
1、 主键约束
2、 唯一约束
3、 自动增长列
4.2 保证域完整性
1、 数据类型约束
2、 非空约束
3、 默认值约束
4.3 保证引用完整性
1、外键约束:从表中的公共字段是主表的外键
4.3.1 主表和从表
两个表建立关系(两个表只要有公共字段就有关系),一个表称为主表,一个表称为从表。
外键约束可以实现:
1、 主表中没有的从表中不允许插入
2、 从表中有的主表中不允许删除
3、 不能更改主表中的值而导致从表中的记录孤立存在。
4、 先删除从表,再删除主表
4.3.2 外键(foreign key)
1、 外键:从表中的公共字段,公共字段的名字可以不一样,但是数据类型必须一样。
2、 外键约束用来保证引用完整性
4.3.3 添加外键
方法一:创建表的时候添加外键
方法二:修改表的时候添加外键
脚下留心:要创建外键必须是innodb引擎,myisam不支持外键约束
4.3.4 查看外键

4.3.5 删除外键
通过外键的名字删除外键
例题
5 外键操作
1、 严格操作(前面讲的是严格操作)
2、 置空操作(set null):如果主表记录删除或更新,从表置空
3、 级联操作(cascade):如果主表记录删除或更新,从表级联
一般来说:主表删除的时候,从表置空操作,主表更新的时候,从表级联操作。
例题
Last updated
Was this helpful?