3、约束条件与表关系判断
一、约束条件
在字段类型的基础之上添加的额外约束
1、无符号与填充
unsgined # 无符号(正负号)
zerofill # 填充(用零填充)
# 上述两个是最基础的约束条件,并不常用,了解即可
2、not null非空
# not null非空:作用就是为某个字段不得为空,必须写值
create table h0(
id int,
name varchar(32) not null
);
3、default默认值
default默认值:会设置默认值,用户不填值,就使用默认填充
create table h1( # 创建表
id int,
name char(32),
gender enum('男','女','其他') default '男'
);
insert into h1(id,name) values(1,'poco'); # 不指定性别,默认就是男
insert into h1(id,name,gender) values(2,'诺艾尔','女');
+------+-----------+--------+
| id | name | gender |
+------+-----------+--------+
| 1 | poco | 男 |
| 2 | 诺艾尔 | 女 |
+------+-----------+--------+
4、unique唯一
unique唯一:某一个字段不可重复,比如说实现用户想要注册用户名,但用户名不能重复。
单列唯一的情况下,哪个字段需要就在哪个字段的后面空格再添加unique
多列唯一的情况下,需要在所有字段的最后,用逗号隔开,添加unique()
# 单列唯一(单个字段的数据不能重复)
create table h2(
id int,
name varchar(32) unique
);
insert into h2(id,name) values(1,'poco'); # 写入数据
insert into h2(id,name) values(2,'poco');
# 报错,name字段的数据不能重复(用户名不能重复)
ERROR 1062 (23000): Duplicate entry 'poco' for key 'name'
# 多列唯一(多个字段的数据不能重复)
create table h3(
id int,
name varchar(32),
unique(id,name) # 括号内添加多个不能重复的字段
);
5、primary key主键
单从限制角度上来看,主键相当于是非空且唯一,主键拥有 非空 和 唯一的特性
InnoDB存储引擎规定了在创建表的时候必须且只有一个主键,如果不设主键,InnoDB会采用内部隐藏的字段为主键,但是隐藏就意味着我们无法使用。如果没有设主键但有非空且唯一的字段,那么会自动将该字段升级为主键。
主键相当于表每一行的索引,所以我们在创建表的时候一般都会创建一个id字段(序号\编号),并且我们会将该字段设置为主键,就用id int primary key的方式
create table h4(
id int primary key, # 设置主键
name varchar(32),
age int);
主键特征
# 1.delete from
不会影响主键的自增
# 2.truncate
清空表数据并且重置主键
6、auto_increment自增
专门用来给key键使用(也可以理解为是专门给主键用的)
设置之后,我们可以不用再写这个字段的值了,它会随着数据自己增加值
create table h5(
id int primary key auto_increment,
name varchar(32)
);
insert into h5(name) values('poco'); # 写入数据
insert into h5(name) values('wendy');
+----+-------+
| id | name |
+----+-------+
| 1 | poco |
| 2 | wendy |
+----+-------+
# 不需要写主键,它会自己填充并随着数据增加
# 以后的主键字段固定写法
id int primary key auto_increment
二、约束条件之外键
在学习外键之前,我们首先得需要搞清楚外键是什么,假设我们公司有三个部门,有十几万的员工,我们要将员工的名字,工号,部门存入表中,这就有一个问题了,我们三个部门对应十几万员工,意味着部门这个字段需要重复的存储,所以,为了解决这个问题,我们完全可以定义一个部门表,然后让员工信息关联该表,如何关联呢,就要用到foreign key外键!
1、表关系和判断
(1) 一对多的判断
例如:站在员工表和部门表为例
1.先站在员工表的角度,一名员工能否对应多个部门,肯定是不可以
2.再站在部门表的角度,一个部门能否对应多名员工,答案是可以的
所以由此得出结论,两边一个可以一个不可以,那么表关系就是“一对多”
# 针对一对多的关系,我们要把外键字段建在多的一方,也就是员工表
(2) 多对多的判断
以书籍表与作者表为例
1.先站在书籍表的角度,一本书能否对应多名作者,答案是可以的
2.再站在作者表的角度,一名作者能否对应多本书,答案也是可以
所以由此得出结论,两边都可以 那么表关系就是“多对多”
# 针对多对多表关系,外键字段并不会建在任何一张关系表,而是单独开设一张新表专门存储
(3) 一对一的判断
以用户表与用户详情表为例
1.先站在用户表角度,一名用户能否对应多个用户详情,答案是不可以
2.再站在用户详情表角度,一个用户详情能否对应多名用户,也不可以
所以由此得出结论,两边都不可以 那么要么没关系 要么“一对一”
# 针对一对一表关系,外键字段建在任何一方都可以,但是推荐你建在查询频率较高的表中
2、SQL语句实现
1、在创建表的一定要 先创建被关联的表(没有外键字段的表)
2、在录入数据的时候 先录入被关联表的数据
(1) 一对多的实现
# 部门表
create table 部门表(
id int primary key auto_increment,
部门 varchar(32),
部门信息 varchar(64)
);
# 员工表
create table 员工表(
id int primary key auto_increment, # 主键
员工姓名 varchar(32),
薪资 int,
部门编号 int,
foreign key(部门编号) references 部门表(id)
);
(2) 多对多的实现
# 书籍表
create table 书籍表(
id int primary key auto_increment,
书名 varchar(32),
价格 float(8,2)
);
# 作者表
create table 作者表(
id int primary key auto_increment,
作者 varchar(32),
性别 varchar(4)
);
# 关系表
create table 书籍关系表(
id int primary key auto_increment,
作者id int,
foreign key(作者id) references 作者表(id)
on update cascade
on delete cascade,
书籍id int,
foreign key(书籍id) references 书籍表(id)
on update cascade # 级联更新
on delete cascade # 级联删除
);
(2) 一对一的实现
# 用户详情表
create table 用户详情表(
id int primary key auto_increment,
地址 varchar(32),
手机号 bigint
);
# 用户表
create table 用户表(
id int primary key auto_increment,
用户名 varchar(32),
年龄 int,
详细id int unique,
foreign key(详细id) references 用户详情表(id)
on update cascade
on delete cascade
);
级联更新/级联删除
外键一旦建立,两张表的关系非常的强耦合,一张表在修改时,必须考虑另外一张表,所以我们必须要用级联,要更新两张表一起更新,要删两张表一期删除。级联添加在有外键字段的表中。
# 部门表
create table dep(
id int primary key auto_increment,
dep_name varchar(32),
dep_desc varchar(64)
);
# 员工表
create table emp(
id int primary key auto_increment,
emp_name varchar(32),
emp_salary int,
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade # 级联更新
on delete cascade # 级联删除
);

浙公网安备 33010602011771号