python学习笔记 day45 视图+触发器

首先创建两张操作的表 stduent表和teacher表:

create table student(
  id smallint not null auto_increment primary key,
  name varchar(40) not null,
  tname varchar(40) not null);

insert into student(name,tname) values("xuanxuan","eva"),("xixi","egon");

select * from student;

create table teacher(
  id smallint not null auto_increment primary key,
  name varchar(40) not null);

insert into teacher(name) values("eva"),("egon");

select * from teacher;

 

运行结果:
        

1. 视图

有时候我们需要创建临时表,临时表是虚拟的,又称为虚拟表,不是真实存在的表(物理表) 如果某一个查询结果作为临时表需要被后续的sql语句多次使用我们就可以为该临时表创建一个视图,下次使用该临时表可以直接使用视图名称;

 

create view v1 as select id,name from teacher where id=2; -- 为上面的查询语句(临时表)创建一个视图,以后用到该查询语句的都可以直接使用视图的名称v1来操作;

select * from v1;

运行结果:

视图是一个虚拟表,并不是真实存在的物理表,所以是无法为视图插入数据的,

但是可以修改视图,删除视图:

create view v1 as select name from student where id=1; -- 修改视图v1 只需要后面的as写新的sql语句即可;
drop view v1; -- 删除视图v1;

 

为临时表创建了视图之后,下次再使用该查询结果(临时表)时可以直接使用视图的名字(注意创建的视图其实就是一个表,临时表虚拟表);

但是视图不太常用,了解即可;

2. 触发器

 有时候需要在对某一个表操作时,同时对另一张表进行其他的某些操作,其实有点类似装饰器,在被装饰的函数前后增加函数的功能,触发器也是类似,在对一张表进行操作(增删改)前后对另一张表进行另外的某些操作,就可以使用触发器(对某张表执行查询操作时不能用触发器);

插入前:

delimiter //  -- 修改sql的终止符为//,不再是遇到;代表sql语句结束
create trigger before_insert before insert on student for each row  -- 触发器,在执行对student表的插入操作之前执行后续begin end之间的sql语句(对teacher表执行插入操作)
BEGIN
insert into teacher(name) values("xuanxuan"); -- 执行到该语句;时并不代表sql执行完了,因为delimiter //修改了终止符为// 
end//
delimiter ;  -- 触发器执行完毕之后把终止符再修改回来;
insert into student(name,tname) values("xigua","eva")  -- 对student表执行插入操作,然后会发现teacher表也会增加一条记录(就是触发器执行的begin end之间的内容)
select * from student;
select * from teacher;

运行结果:
         

 

 插入后:

delimiter //
create trigger after_insert after insert on student for each ROW
BEGIN
insert into teacher(name) values("李老师");
END//
delimiter ;

insert into student(name,tname) values("夏夏","xuanxuan");  -- 对student执行插入操作后,teacher表也会增加一条信息(触发器begin end之间的sql语句)
delimiter ;
select * from student;
select * from teacher;

运行结果:
                   

 

 

 删除前:

insert into student(name,tname) values("xigua","eva");

select * from student;

delimiter //
create trigger before_delete before delete on student for each ROW   -- 对student表执行删除操作(只能是增删改,查操作不会有触发器动作) 会触发teacher表执行begin end之间的操作
BEGIN
insert into teacher(name) values("贾老师");  -- 对student表执行删除操作会对teacher表执行插入操作(当然这里触发器的动作自己来定,可以任意 增删改查。)
END//
delimiter ;

delete from student where name="xigua"; -- 对student执行删除操作后,teacher表也会增加一条信息(触发器begin end之间的sql语句)
delimiter ;
select * from student;
select * from teacher;

运行结果:
                

  

 删除后:

delimiter //
create trigger after_delete after delete on student1 for each ROW
begin
delete from teacher where id=1;
end//
delimiter ;

delete from student where id=1;  -- 对student表执行删除操作时,触发器就会执行删除teacher表中id=1的数据项;

 

 更新前:

delimiter //
create trigger before_update before update on student for each ROW
BEGIN
update teacher set name="Eva" where id=1;
END//

delimiter ;
update student set tname="Eva" where id=1;
select * from student;
select * from teacher;

运行结果:

                     

更新后:

delimiter //
create trigger after_update after update on student for each ROW
BEGIN
update teacher set name="Eva" where id=1;
END//

delimiter ;
update student set tname="Eva" where id=1;
select * from student;
select * from teacher;



如果当操作(增删改)一张表时,需要触发器中动态修改另一张表(上面都是写死了的操作) 可以使用NEW OLD 关键字;

一般new用于一张表insert操作时 动态修改另一张表的数据; old用于delete一张表时 动态修改另一张表的操作;update两者都可以使用;

drop trigger before_insert; -- 先删除前面设置的触发器(对student执行insert操作,会对teacher执行相应的begin end之间的操作),否则多个after_insert trigger会报错~
drop trigger after_insert; 

delimiter //
create trigger after_insert after insert on student for each row
BEGIN
insert into teacher(name) values(new.name);  -- 当对student执行插入操作时,另一张表teacher会触发执行insert操作,但是这次是动态增加 增加的teacher表中的name就是student表中的name字段值
END //
delimiter ;
insert into student(name,tname) values("哈哈","xuanxuan");  -- 增加student数据项,触发器会为teacher表动态增加name=student.name的数据项;
select * from teacher;
select * from student;

 

 运行结果:

     

 

posted @ 2018-11-19 18:56  写的BUG代码少  阅读(293)  评论(0编辑  收藏  举报