zoukankan      html  css  js  c++  java
  • 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;

     运行结果:

         

    talk is cheap,show me the code
  • 相关阅读:
    JAVA--导数到Mongodb
    关于jquery的事件委托-bind,live,delegate,on的区别发展
    cookies localStorage和sessionStorage的区别
    px em 和rem之间的区别
    js中string常用方法
    js中number常用方法
    json格式常用操作
    Node.js到底是做什么的?这是我看到最好的解释了
    数组常用操作方法
    JQuery.Ajax()的data参数类型
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9984714.html
Copyright © 2011-2022 走看看