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、浮点的精度可能会丢失【精度指的是小数】

1536718268668

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。 1536719919287

3、varchar理论长度是65535字节,实际根本达不到。具体长度与字符编码有关。 1536720096028

1536720113031

4、一个记录的总长度不能超过65535个字节。

5、大块文本(text)不计算在总长度中,一个大块文本只占用10个字节来保存文本的地址。 1536720763914

1.3 枚举(enum)

1、从集合中选择一个数据(单选)

2、MySQL的枚举类型是通过整数来管理的,第一个值是1,第二个值是2,以此类推。

1536721403493

3、既然枚举在数据库内部存储的是整数,那么可以直接插入数字

枚举的优点:

1、 运行速度快(数字比字符串运算速度快)

2、 限制数据,保证数据完整性

3、 节省空间

1.4 集合(set)

从集合中选择一些数据(多选)

每个集合的元素都分配一个固定的数字,分配的方式从左往右按2的0、1、2、…次方

1536723512843

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 关于数据类型的思考题

  1. 手机号码一般使用什么数据类型存储? char

  2. 电话号码使用什么数据类型 varchar

  3. 性别一般使用什么数据类型存储? char enum

  4. 学生年龄信息一般使用什么数据类型存储? tinyint

  5. 照片信息一般使用什么数据类型存储? binary

  6. 薪水一般使用什么数据类型存储? decimal

多学一招:一个字段到底选数字还是字符,取决于有没有计算的可能,如果没有计算的可能即使是数字也要用字符类型,比如手机号、QQ号,…

2 列属性

2.1 是否为空(null | not null)

null:可以为空

not null:不可以为空

思考题

  1. 学员姓名允许为空吗? 非空

  2. 家庭地址允许为空吗? 非空

  3. 电子邮件信息允许为空吗? 可以为空

  4. 考试成绩允许为空吗? 可以为空

2.2 默认值(default)

1、如果一个字段没有插入值,可以默认插入一个指定的值。

2、default关键字用来插入默认值

2.3 自动增长(auto_increment)

1、字段的值从1开始,每次递增1,特点就在字段中的数据不可能重复,适合为记录生成唯一的id

2、自动增长都是无符号整数。

3、在MySQL中,auto_increment必须是主键。但是主键不一定是自动增长的。

4、如果要给自动增长列插入数据,使用null关键字。

5、自动增长列上的数据被删除,默认情况下此记录的编号不再使用。

1536737314504

2.4 主键(primary key)

主键:唯一标识表中记录的一个或一组列

主键的特点:不能重复,不能为空

一个表只能有一个主键,主键可以有多个字段组成。

主键的作用:

1、 保证数据完整性

2、 加快查询速度

2.4.1 添加主键

方法一:创建表的时候添加主键

方法二:创建表的时候添加主键

方法三:更改表的时候添加主键

2.4.2 创建组合键

1536736467251

2.4.3 查看主键

1536736627655

2.4.4 删除主键

1536736700169

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 删除唯一键

通过唯一键的名字来删除唯一键

1536739081697

问题:主键和唯一键的区别?

1、主键不能重复,不能为空,唯一键不能重复,可以为空

2、主键只有一个,唯一键可以有多个。

2.6 备注(comment)

为了程序员之间的相互交流 1536739540981

3 SQL注释

单行注释:--或#

多行注释:/ /

1536739661909

4 数据完整性介绍

1536739894901

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 查看外键

1536742477588

4.3.5 删除外键

通过外键的名字删除外键

例题

5 外键操作

1、 严格操作(前面讲的是严格操作)

2、 置空操作(set null):如果主表记录删除或更新,从表置空

3、 级联操作(cascade):如果主表记录删除或更新,从表级联

一般来说:主表删除的时候,从表置空操作,主表更新的时候,从表级联操作。

例题

Last updated

Was this helpful?