3、约束条件和表关系判断

目录

一、约束条件

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  # 级联删除
);
上一篇:mysql数据库(6)--常见的约束


下一篇:Scala 小练习