概述
首先创建两张操作的表 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;
运行结果:
转载于:https://www.cnblogs.com/xuanxuanlove/p/9984714.html
最后
以上就是帅气钢笔为你收集整理的python学习笔记 day45 视图+触发器的全部内容,希望文章能够帮你解决python学习笔记 day45 视图+触发器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复