一、约束条件
1、无符号与填充
# 在字段类型的基础之上添加的额外约束
1.unsgined # 无符号(正负号)
2.zerofill # 填充
# 上述两个是最基础的约束条件,并不常用,了解即可
2、not null非空
# not null非空:作用就是为某个字段不得为空,必须写值
create table t2(
id int,
name varchar(32) not nul2l
);
3、default默认值
# default默认值:会设置默认值,用户不填值,就使用默认填充
create table t3(
id int,
name char(32),
gender enum('male','female','others') default 'male'
);
4、unique唯一
# unique唯一:某一个字段不可重复,比如说用户想要注册用户名,但用户名不能重复,所以就用这个
# 单列唯一
create table t4(
id int,
name varchar(32) unique
);
# 多列唯一
create table t5(
id int,
host varchar(32),
port int,
unique(host,port)
);
5、primary key主键
primary key主键
# 第一个特点:单从限制角度上来看 主键相当于是非空且唯一
id int primary key == id int not null unique
create table t6(
id int primary key
);
'''
1.InnoDB存储引擎规定了在创建表的时候必须且只有一个主键,那好像我们之前创建表并没有主键呢
之所以这样,是因为表中没有任何约束条件字段时,为了能顺利创建表,InnoDB会采用内部隐藏的字段为主键,隐藏就意味着我们无法使用
2.没有主键但有非空且唯一的字段,那么会自动将该字段升级为主键,我们在创建表的时候一般都会创建一个id字段(序号\编号),并且我们会将该字段设置为主键,就用id int primary key的方式
'''
主键特征
# 1.delete from
不会影响主键的自增
# 2.truncate
清空表数据并且重置主键
6、auto_increment自增
# 专门用来给key键使用(你就理解为是专门给主键用的)
create table t8(
id int primary key auto_increment,
name varchar(32)
);
# 以后的主键字段固定写法
id int primary key auto_increment
二、约束条件之外键
在学习外键之前,我们首先得需要搞清楚外键是什么,假设我们公司有三个部门,有十几万的员工,我们要将员工的名字,工号,部门存入表中,这就有一个问题了,我们三个部门对应十几万员工,意味着部门这个字段需要重复的存储,所以,为了解决这个问题,我们完全可以定义一个部门表,然后让员工信息关联该表,如何关联呢,就要用到foreign key外键!
1、表关系和判断
# 表关系
1.一对一
2.多对多
3.一对一
# 表关系判断
使用‘换位思考法’
(1) 一对多
例如:站在员工表和部门表为例
1.先站在员工表的角度,一名员工能否对应多个部门,肯定是不可以
2.再站在部门表的角度,一个部门能否对应多名员工,答案是可以的
所以由此得出结论,两边一个可以一个不可以,那么表关系就是“一对多”
# 针对一对多的关系,我们要把外键字段建在多的一方,也就是员工表
(2) 多对多
以书籍表与作者表为例
1.先站在书籍表的角度,一本书能否对应多名作者,答案是可以的
2.再站在作者表的角度,一名作者能否对应多本书,答案也是可以
所以由此得出结论,两边都可以 那么表关系就是“多对多”
# 针对多对多表关系,外键字段并不会建在任何一张关系表,而是单独开设一张新表专门存储
(3) 一对一
以用户表与用户详情表为例
1.先站在用户表角度,一名用户能否对应多个用户详情,答案是不可以
2.再站在用户详情表角度,一个用户详情能否对应多名用户,也不可以
所以由此得出结论,两边都不可以 那么要么没关系 要么“一对一”
# 针对一对一表关系,外键字段建在任何一方都可以,但是推荐你建在查询频率较高的表中
2、SQL语句实现
(1) 一对多
# 1.先创建基本字段
# 2.再考虑外键字段
# 员工表
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)
);
# 部门表
create table dep(
id int primary key auto_increment,
dep_name varchar(32),
dep_desc varchar(64)
);
"""
1.在创建表的是先创建被关联的表(没有外键字段的表)
2.在录入数据的时候先录入被关联表的数据
3.修改或者删除被关联表数据
"""
(2) 多对多
# 书籍表
create table book(
id int primary key auto_increment,
title varchar(32),
price float(8,2)
);
# 作者表
create table author(
id int primary key auto_increment,
name varchar(32),
age int
);
# 关系表
create table book2author(
id int primary key auto_increment,
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
book_id int,
foreign key(book_id) references book(id)
on update cascade # 级联更新
on delete cascade # 级联删除
);
(2) 一对一
# 用户表
create table userinfo(
id int primary key auto_increment,
name varchar(32),
age int,
detail_id int unique,
foreign key(detail_id) references userinfo_detail(id)
on update cascade
on delete cascade
);
# 用户详情表
create table userinfo_detail(
id int primary key auto_increment,
addr varchar(32),
phone bigint
);
级联更新级联删除
外键一旦建立,两张表的关系非常的强耦合,一张表在修改时,必须考虑另外一张表,所以我们必须要用级联,要更新两张表一起更新,要删两张表一期删除。
# 部门表
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 # 级联删除
);