文章目录
- 此专栏所有章节快速导航
- 一. 前言
- 二. 表的约束
- 2.1 空属性
- 2.2 默认值
- 2.3 列描述
- 2.4 zerofill
- 2.5 主键
- 2.5.1 单主键
- 2.5.2 复合主键
- 2.6 唯一键
- 2.6.1 简述
- 2.6.2 唯一键和主键
- 2.7 自增长
- 2.7.1 简述
- 2.7.2 自增长特点
- 2.8 外键
- 2.8.1 简述
- 2.8.2 外键的使用场景
- 三. 综合案例
- 3.1 数据
- 3.2 要求
- 3.3 实现
一. 前言
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。
二. 表的约束
2.1 空属性
字段默认情况下是可以为
null
(空)的,但是像学生的学号和姓名是不能为空的,所以我们要在后面加一个not null
。如下图显示,Null
的那一列显示的是NO
,这样如果插入的时候不赋值会直接报错
# 案例
create table student
(
id char(8) not null,
name varchar(32) not null
);
2.2 默认值
某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。
not null
和defalut
一般不需要同时出现,因为default
本身有默认值,不会为空。
create table stu
(
name varchar(32) not null,
age tinyint unsigned default 18 # 插入数据时,如果没有age字段赋值,就使用默认值18
);
2.3 列描述
comment
,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。
create table stu
(
name varchar(32) not null comment '姓名',
age tinyint unsigned default 18 comment '年龄'
);
2.4 zerofill
zerofifill
属性的作用,如果宽度小于设定的宽度,自动填充0,补多少个零由int(x)的x决定。 要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是实际的数字。
create table t1
(
a int,
b int(5) zerofill # 这里的5的意思是,如果保存的数字不够长度,在显示的时候自动会补0,补到5个数字
);
2.5 主键
2.5.1 单主键
primary key
用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键,主键所在的列通常是整数类型。如下图所示主键是不能为空的,插入的时候也不能跟已有的主键数据重复,否则会报错。
# 创建表时就定义好主键
create table stu
(
id int unsigned primary key, # id为主键
name varchar(32) not null
);
# 删除主键(注意删除主键后,原主键字段还会保留不能为空的属性)
# alter table 表名 drop primary key;
alter table stu drop primary key; # 从stu表中删去主键
# 追加主键(追加的字段需要保证该字段不能没有空的数据,也没有重复的数据)
# alter table 表名 add primary key(字段列表)
alter table stu add primary key(id); # 设置id字段为stu表的主键
2.5.2 复合主键
复合主键就是由多个字段组合成一个主键,被设置成复合主键的字段都不能为空,组成复合主键的个别字段可以重复,但是不能让所有的字段都重复。
create table t1
(
a int unsigned ,
b int unsigned,
primary key(a, b) # 设置a和b两个字段为复合主键
);
2.6 唯一键
2.6.1 简述
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键,唯一键就可以解决表中有多个字段需要唯一性约束的问题。
2.6.2 唯一键和主键
唯一键的本质和主键差不多,不能够重复,但是唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
create table t1
(
a int unsigned primary key, # 主键
b int unsigned unique # 唯一键
);
2.7 自增长
2.7.1 简述
自增长
auto_increment
,当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
create table stu
(
a int unsigned primary key auto_increment, # 设置成auto_increment的主键插入数据时可以不给值,系统会自动赋值
name varchar(32)
);
2.7.2 自增长特点
- 任何一个字段要做自增长,前提是本身是一个索引(
key
一栏有值,比如设置成主键唯一键等等)- 自增长字段必须是整数
- 一张表最多只能有一个自增长
2.8 外键
2.8.1 简述
外键用于定义主表和从表之间的关系,外键约束主要定义在从表上,主表则必须是有主键约束或
unique
约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null
,否则插入数据的时候会报错。
# 主表
create table class
(
id int primary key,
name varchar(32) not null
);
# 从表
create table stu
(
id int primary key,
name varchar(32) not null,
class_id int,
foreign key(class_id) references class(id) # 声明外键
);
2.8.2 外键的使用场景
比如一个学校的一年级有三个班,id分别为001,002,003。学校需要设计一张表录入一年级学生的信息,其中一个字段为班级id的。这个时候如果没有约束的话,在学生表录入信息时可能会被录入004,005这样的班级,这是不对的。所以我们需要在学生表里面将班级表的id设置为外键,这样在录入班级id的时候就只能录入001,002,003这三个数据了。
三. 综合案例
3.1 数据
- 商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供应商provider)
- 客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)
- 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)
3.2 要求
- 客户的姓名不能为空值
- 邮箱不能重复
- 客户的性别(男,女)
3.3 实现
# 商品
create table if not exists goods
(
goods_id int(5) unsigned zerofill primary key auto_increment,
goods_name varchar(32) not null,
unitprice float(5,3) unsigned not null,
category varchar(32) not null,
provider varchar(32) not null
);
# 客户
create table if not exists customer
(
customer_id int(5) unsigned zerofill primary key auto_increment,
name varchar(32) not null,
address varchar(32) not null,
email varchar(32) unique,
sex enum('男', '女') not null,
card_id char(18) unique
);
# 订单
create table purchase
(
order_id int(5) unsigned zerofill primary key auto_increment,
customer_id int(5) unsigned,
goods_id int(5) unsigned,
nums smallint unsigned not null,
foreign key (customer_id) references customer(customer_id),
foreign key (goods_id) references goods(goods_id)
);