发布时间:2025-12-10 11:50:52 浏览次数:8
在数据库中设置一段静态的代码 , 这个代码并不会自己执行也不需要手动的调用, 当某一个操作触发到了设置的条件 的时候,就会自动的执行这段代码。
delimiter $$create trigger 触发器名称 触发时间 触发条件 on 表名 for each rowbegin触发事件end $$delimiter ;-- on 表名:因操作那个表而触发-- 触发时间:before 在触发条件之前;after 在触发条件之后-- 触发条件:insert , update , delete-- new 新数据:insert , update-- old 旧数据:update , delete create table t1(id int primary key,name char(5),cls_num int,gerden enum('男','女'));create table t2(id int primary key,cls_num int,stu_num int);insert into t1 values (1 , '张三',2201,'男'),(2 , '李四',2201,'男'),(3 , '王五',2202,'女'),(4 , '赵六',2201,'男');insert into t2(id , cls_num) values (1 , 2201),(2 , 2202);-- 获取2201班级人数select count(id) from t1 where cls_num=2201;update t2 set stu_num=(select count(id) from t1 where cls_num=2202)where cls_num=2202;-- 增加学生信息 , 对应的班级人数也自动增加delimiter $$create trigger tri after insert on t1 for each rowbegin -- 1、获得学生对应班级人数-- 在触发器中定义变量-- declare 变量名 数据类型declare num int;set num=(select stu_num from t2 where cls_num=new.cls_num);-- 对应班级人数+1update t2 set stu_num=num+1 where cls_num=new.cls_num;end $$delimiter ;insert into t1 values (5 , '李雷' , 2202 , '男');-- 这个语句会触发两次insert into t1 values (10 , '韩梅梅' , 2201 , '女'),(11 , '小明同学' , 2202 , '男');insert into t1 values (12 , '木每' , 2201 , '女'),(13 , '雨田' , 2201 , '男'),(14 , '小日月' , 2201 , '男');-- 修改学生班级 , 对应班级的人数应该跟着改动delimiter $$create trigger tir_update after update on t1 for each rowbegin -- 1、获得学生对应班级的人数declare num_old int;-- 旧班级学生人数declare num_new int;-- 新班级学生人数-- 旧班级学生人数set num_old=(select stu_num from t2 where cls_num=old.cls_num);-- 新班级学生人数set num_new=(select stu_num from t2 where cls_num=new.cls_num);-- 对应班级人数+1/-1update t2 set stu_num=num_new+1 where cls_num=new.cls_num;update t2 set stu_num=num_old-1 where cls_num=old.cls_num;end $$delimiter ;update t1 set cls_num=2202 where id=10;视图:是一个虚拟的表 , 其内容由查询结果定义。
视图的结构与真实表格结构是一样的 , 视图最好只作为查询操作
视图可以简化高频,复杂的查询语句操作
-- 创建视图create view 视图名称 as select查询语句;-- 查询数据库中所有的视图show full tables in 数据库名称 where table_type like 'VIEW';-- 删除视图drop view 视图名称;create view tt as select * from t1 where gerden='女';select * from tt;update tt set cls_num=2202 where id=10;show full tables in class13 where table_type like 'VIEW';drop view tt;索引:数据库的性能调优 ;提升数据库的工作效率
1、主键索引
2、普通索引
3、唯一索引
使用索引:索引可以在一定情况下加快查询数据速度
当表的查询大于修改 , 删除的操作,可以创建索引;
当表查询操作很少 , 表的数据很少,不建议创建索引;
-- 在创建表的时候创建索引create table 表名(字段名 数据类型,index 索引名(字段名),字段名 数据类型,unique 索引名(字段名));-- 在表已存在的时候创建索引create index 索引名 on 表名(字段名);-- 唯一索引create unique index 索引名 on 表名(字段名);-- 查看索引show keys from 表名;-- 删除索引drop index 索引名称 on 表名;create table t3(id int,index d(id));create table t4(id int ,name char(5));create unique index num on t4(id);show keys from t4;show keys from t3;drop index d on t3;mysql的事务主要用于处理操作量大,复杂度高的数据;
事务处理可以用来维护数据库的完整性 , 保证SQL语句要么全部执行 , 要么全部不执行
事务用来管理insert ,update , delete语句
事务满足四个条件(ACID): 原子性 , 稳定性 , 隔离性 , 可靠性
原子性:一组事务 , 要么成功 , 要么撤回
稳定性:有非法数据,事务撤回
隔离性:各个事务之间独立运行 , 一个事务处理后的结果影响其他事务 , 要么就是其他事务会撤回。
可靠性:当电脑崩溃,InnoDB数据表驱动会利用日志文件重构修改。
事务隔离级别
隔离级别
读未提交:read uncommitted
事物A和事物B,事物A未提交的数据,事物B可以读取到
这里读取到的数据叫做“脏数据”
这种隔离级别最低,这种级别一般是在理论上存在,数据库隔离级别一般都高于该级别
读已提交:read committed
事物A和事物B,事物A提交的数据,事物B才能读取到
这种隔离级别高于读未提交
换句话说,对方事物提交之后的数据,我当前事物才能读取到
这种级别可以避免“脏数据”
这种隔离级别会导致“不可重复读取”
可重复读:repeatable read
事务A和事务B,事务A提交之后的数据,事务B读取不到
事务B是可重复读取数据
这种隔离级别高于读已提交
MySQL默认级别
虽然可以达到可重复读取,但是会导致“幻像读”
串行化:serializable
事务A和事务B,事务A在操作数据库时,事务B只能排队等待
这种隔离级别很少使用,吞吐量太低,用户体验差
这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B
串行,而不并发
-- 开启事务begin;-- 提交事务commit;-- 回滚 回滚到事务开始之前rollback;begin;insert into t3 values(600);rollback;begin;insert into t3 values(400);commit;