目录
约束
约束的概念和分类
1、约束的概念:
2、约束的分类
1、主键约束
2、默认约束
3、非空约束
4、唯一约束
5、外键约束
约束
约束的概念和分类
1、约束的概念:
- 约束时作用于表中列上的规则,用于限制加入表的数据
- 约束的存在保证了数据库中数据的正确性、有效性和完整性
2、约束的分类
练习:
CREATE TABLE emp(
id INT PRIMARY KEY,
ename VARCHAR(50) NOT NULL UNIQUE,
joindate DATE NOT NULL,
salary DOUBLE(7,2) NOT NULL,
bonus DOUBLE(7,2) DEFAULT 0
);
insert into emp(id,ename,joindate,salary,bonus) VALUES(1,'张三','1999-11-11',8800,5000);
---------------------------------------------------------------------------------------------------
1、测试主键约束 非空且唯一(将id的1改为了null)
又运行了一遍已有的,显示[Err] 1062 - Duplicate entry '1' for key 'PRIMARY'
--------------------------------------------------------------------------------------------------------------
2、测试非空约束 不能为null
测试主键的时候已经测试了不能为空,这里就不演示啦
--------------------------------------------------------------------------------------------------------------
3、测试唯一约束 表中所有数据各不相同
这里也是,主键的时候测试了以下,也就不演示啦
--------------------------------------------------------------------------------------------------------------
4、测试默认约束 未指定值则采用默认值
这里我把bonus和5000 去掉了,我们看看结果是什么
取值为默认值0
只有不添加任何值的时候默认约束才能生效,输入null的话,显示的就是null。我们来看一下
显示的就是null,而不是0;
--------------------------------------------------------------------------------------------------------------
5、测试自动增长:auto_increment 当列是数字类型并且唯一约束
这里我们得重新建表
drop table if EXISTS emp;
CREATE TABLE emp(
id INT PRIMARY KEY auto_increment,
ename VARCHAR(50) NOT NULL UNIQUE,
joindate DATE NOT NULL,
salary DOUBLE(7,2) NOT NULL,
bonus DOUBLE(7,2) DEFAULT 0
);
没加数据的就把前面的id删了
我们看一下结果如何
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
在建完表后如果要添加约束的话,我们该如何取写代码
1、主键约束
alter table 表名 add primary key(字段名);
删除约束:
alter table 表名 drop index 字段名;
2、默认约束
alter table 表名 alter 列名 set default 默认值;
删除约束
alter table 表名 alter 列名 drop default;
3、非空约束
alter table 表名 modify 字段名 数据类型 not null;
删除约束:
alter table 表名 modify 字段名 数据类型;
4、唯一约束
alter table 表名 modify 字段名 数据类型 unique;
删除约束
alter table 表名 drop index 字段名;
5、外键约束
外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性
添加约束
创建时添加外键约束
create table 表名(
列名 数据类型,
.....
[constraint][外键名称] foreign key (外键字段名) references 主表名称(主表列名称)
);
建完表后添加外键约束
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表名称(主表列名称)
删除约束:
alter table 表名 drop foreign key 外键名称;
添加外键dep_id,关联dept表的主键
代码在这哦
CREATE table dept(
id int PRIMARY key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
create table emp(
id int PRIMARY key auto_increment,
name varchar(20),
age int,
dep_id int,
CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id)
);
insert into dept(dep_name,addr) VALUES('研发部','广州'),('销售部','深圳');
insert into emp(name,age,dep_id) VALUES('张三',20,1),('李四',20,1),('王五',20,1),('赵六',20,2),('孙七',22,2),('周八',18,2);
这样就不能删除dept表中的数据了
会显示有外键的约束
但如果我想要删除研发部,那就得先删除张三李四王五三条数据
这样就可以删除研发部了
----------------------------------------------------------------
在对象中按住ctrl选中这两张表
再点击逆向表到模型
就能看到这俩张是有个外键约束着的
删除外键:
alter table emp drop FOREIGN key fk_emp_dept;
这样两张表中的线就没了
创建过表之后添加外键:
alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);
数据库设计
表关系
-
一对一:
如:用户和用户详情
一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
实现方式:在任意一方加入外键,关联另一方主键,并设置外键为唯一(unique)
-
一对多(多对一):
如:部门和员工(一个部门可以对应多个员工,一个员工对应一个部门)
实现方式:在多的一方建立外键,指向一的一方的主键
-
多对多:
如:商品和订单(一个商品对应多个订单,一个订单包含多个商品)
实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
多表查询
多表查询:从多张表中查询数据
连接查询
内连接:相当于查询A、B的交集数据
外连接:
左外连接:相当于查询A表所有数据和交集部分的数据
右外连接:相当于查询B表所有数据和交集部分的数据
子查询
对于这两张表,我们如果直接用
select * from emp,dept;
查询的话会显示24条数据
这就涉及到了笛卡尔积:有A、B两个集合,取A、B所有的组合情况
我们得消除无效数据,就得设置一个条件emp.dep_id=dept.did
这其实就是连接查询中内连接的一种
内连接
隐式内连接
select 字段列表 from 表1,表2... where 条件;
查询 emp表的name,sex和dept表的dname
显示内连接
select 字段列表 from 表1 [inner] join 表2 on 条件;
这里的inner可以省略
外连接
左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件;
右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件;
子查询
查询中嵌套查询,称嵌套查询为子查询
子查询根据查询的结果不同,作用不同:
- 单行单列:作为条件值,使用= 、!=、> 、<等进行条件判断
select 字段列表 from 表 where 字段名 = (子查询);
- 多行单列:作为条件值,使用in等关键字进行条件判断
select 字段列表 from 表 where 字段名 in (子查询);
- 多行多列:作为虚拟表
select 字段列表 from (子查询) where 条件;
下面来看例子
查询 猪八戒的工资
查询工资高于猪八戒的员工信息
但如果我们要将二者合二为一也是可以的
图中划红线的就是子查询
多行单列子查询👇
多行多列子查询
这里的t1是取的别名
-------------------------------------------------------------------------------------------------------------------------
事务
事务简介
- 数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令
- 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败
- 是事务是一个不可分割的工作逻辑单元
数据库事务是指由一系列的数据库操作组成的逻辑单元,这些操作要么全部成功执行,要么全部失败回滚。事务具有以下四个特性:
-
原子性(Atomicity):事务中的操作要么全部成功执行,要么全部失败回滚。事务是一个不可分割的工作单位。
-
一致性(Consistency):事务执行后,数据库从一个一致性状态转换到另一个一致性状态。事务执行过程中,数据库的约束条件始终被满足。
-
隔离性(Isolation):事务的执行是相互隔离的,一个事务的执行结果对其他事务是不可见的。事务之间不会相互干扰。
-
持久性(Durability):事务执行成功后,对数据库的修改是永久性的。
数据库事务能够保证数据的完整性和一致性,减少数据的冲突和错误。在高并发的系统中,使用数据库事务可以确保数据的正确处理和操作的原子性。
开启事务
START TRANSACTION; 或者BEGIN;
提交事务
COMMIT;
回滚事务
ROLLBACK;
来做个案例试试,代码给大家放在这里啦
drop table if exists account;
CREATE table account(
id int PRIMARY key auto_increment,
name varchar(10),
money DOUBLE(10,2)
);
insert into account(name,money) VALUES('张三',1000),('李四',1000);
接下来我们在两条语句中加一句话,制造异常
这就会报错,我们来看一下数据有没有被修改
李四的数据被修改了,报错下面的语句就没有被执行了
然后我们新建了一个查询模仿别人是否可以看到数据的变化
结果显示,也发生了变化
接下来我们将数据还原并开启事务看看会发生什么
我们来看看数据有没有被修改呢
被修改了,我们再看看新建查询里查询的数据有没有被修改
数据并没有被修改
我们开启事务之后,做的那些操作都是一些临时性的操作,在我们当前的用户窗口里可以查到,但是在其他的用户窗口里是查不到的
出错了之后我们就要取回滚事务
在当前窗口数据就恢复了,回滚到事务开始之前的状态
然后我们解决问题,将出错了注释掉之后,问题就解决了
没有问题我们就用commit提交事务,数据就会被持久性的更改
Mysql事务默认自动提交
查看事务的默认提交方式
select @@autocommit;
1为自动提交
0为手动提交
修改事物的提交方式
set @@autocommit=0;
这里我们执行以下看看
当前窗口的数据被修改了
那我们看看新建的窗口如何
数据没有被改变,因为我们把事务提交改为了手动提交,mysql就不帮我们自动提交了
执行了commit之后数据才能生效
别人也可以看到数据被修改了
到这里也就结束啦,大家继续加油哦,继续努力!!!