mysql基础-3

18 阅读4分钟

1 触发器

-- 1 日志信息表记录对学生信息的操作记录对学生的进行了什么样的操作
create table stulogs(
   id int PRIMARY key auto_increment,
	 time TIMESTAMP,
	 log_text varchar(200)
);

-- 2 添加一条学生信息的时候
insert into students(stu_num,stu_name,stu_gender,stu_age) values('2012','走走','男',23);
insert into stulogs(time,log_text) values(now(),'添加一条信息');
-- 3 删除一条学生信息的时候
delete from students where stu_num = '2012';
insert into stulogs(time,log_text) values(now(),'删除一条信息');

-- 4 触发器就是一种特殊的存储过程,但是无需调用,被动触发就叫触发器 insert delete UPDATE 时才会触发
-- 5 案例说明
-- 学生信息表students 操作日志表stulogs
-- 5.1 像students 修改删除添加的时候调用
-- 5.2 创建触发器
create TRIGGER tri_test1
AFTER insert on students
for each ROW
insert into stulogs(time,log_text) values(now(),concat('添加',new.stu_num,'学生信息'));
-- befer AFTER
-- insert update DELETE
-- for each row --只要操作一行就触发

-- 5.3 查看触发器
show triggers;
-- drop trigger tri_test1;
-- 5.4 添加学生信息 测试触发器
insert into students(stu_num,stu_name,stu_gender,stu_age) values('2999','六子','女',33);
insert into students(stu_num,stu_name,stu_gender,stu_age) values('2949','气子','女',33);
insert into students(stu_num,stu_name,stu_gender,stu_age) values('2599','吧子','女',33);

-- 5.5 删除触发器 	
-- drop trigger tri_test1;

-- 5.6 New 和 old 
-- 用来监听insert update delete 
-- 我们可以使用new 和olg 再触发器中获取触发这个触发器的数据
-- 5.6.1 new 用来获取,insert 添加的信息,update 修改后的数据
-- 5.6.2 old 用来获取delete 删除前的数据,update 修改前的信息
-- 5.6.3 修改触发器
create trigger tri_test2
after update on students for each row 
insert into stulogs(time,log_text) values(now(),concat('修改',old.stu_name,'的学生信息'));

update students set stu_name = '王刚' where stu_num = '1111';

-- 5.6.4 删除触发器
create trigger tri_test3
after delete on students for each ROW
insert into stulogs(time,log_text) values(now(),concat('删除',old.stu_name,'的学生信息'));

delete from students where stu_name = '八子';

-- 6 触发器的优点
-- 6.1 自动的执行的时候立即执行
-- 6.2 触发器可以实现数据的级联操作,有利于保证数据的完整性 可以对dml的操作进行更复杂的合法校验
-- 7 缺点
-- 7.1 业务如果触发器业务逻辑出现问题难以定位,后期维护困难
-- 7.2 大量使用的话导致代码结构混乱,复杂
-- 7.3 执行效率会变的比较慢
-- 7.4 log: 现在互联网项目里面使用触发器,带来的困难比方便多  
-- 7.5 log: 并发量大的时候也不提倡使用存储过程,加了数据库的负载也不利于数据库的迁移







2 视图

-- 11 视图
-- 11.1 概念 数据库里面一份表或者多表按照特定条件查询出来的数据的集合
-- 11.2 视图也是一个(虚拟)表,但是视图没有数据的,来源于数据表,也不占用空间 (满足特定条件的)
-- 11.3 视图的作用 
-- 1 数据的安全性:可以让不安全的数据生成视图,获取数据,从而达到数据表中的部分数据对用户隐藏    
-- 2 简单性:来直接看视图的话,对用户来说简单
-- 11.3 创建视图
create view view_test1
AS
select * from students where stu_gender = '男';
-- 查询视图
SELECT * from view_test1;
-- 创建视图 链接起来的表
create view view_tes2
AS
select * 
from books b inner join records r inner join students s 
on b.book_id = r.bid;

create view view_tes3
AS
select * 
from books b inner join records r 
on b.book_id = r.bid;

-- 11.4 特性
-- 1 虚拟表,对视图的操作对原表的数据是否有影响
-- 2 数据表里面添加了数据表也可以再查询视图的时候查询到
-- 3 也就是说,视图是实时更新的对应数据表的变化
select * from view_test1;
-- 4 新增数据
insert into view_test1 values('2930','木子','男',22);
delete from view_test1 where stu_num = '2930';
update view_test1 set stu_num = '1119' where stu_num = '1111';
-- 5 你可以在简单的视图表里面insert update delete 这些都可以对原表的数据修改
select * from view_test3;
delete from view_test3 where book_name = 'java';-- 失败操作
-- 6 对于复杂的数据表的链接,就不可以了 
-- 7 查询视图结构
desc view_test3;
-- 8 修改视图结构
create or replace view view_test1
AS
select * from students where stu_gender = '女';

-- 或者
alter  view view_test1
AS
select * from students where stu_gender = '男';

-- 9 删除视图不会影响原表的数据
drop view view_test2;