存储过程

为什么需要存储过程

频繁处理sql语句降低了系统性能(sql语句每次都是先编译后执行)

语句

create procedure +一般是表名(字段)
begin
end;

优点

  1. 封装性
    存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的 SQL 语句,并且数据库专业人员可以随时对存储过程进行修改,而不会影响到调用它的应用程序源代码。
  2. 可增强SQL语句的功能和灵活性
    存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
  3. 可减少网络流量
    由于存储过程是在服务器端运行的,且执行速度快,因此当客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而可降低网络负载。
  4. 高性能
    存储过程执行一次后,产生的二进制代码就驻留在缓冲区,在以后的调用中,只需要从缓冲区中执行二进制代码即可,从而提高了系统的效率和性能。
  5. 提高数据库的安全性和完整性
    使用存储过程可以完成所有数据库操作,并且可以通过编程的方式控制数据库信息访问的权限。

触发器

为什么使用触发器

为了提高查询效率,在流过期后会从数据库中删除相关的流记录信息,精简主表,但是这样并不利于后期的查询需求,因此需要创建触发器,在删除一条主表记录的同时将删除的数据备份到另一张表格中。
mysql中触发器是一个特殊的存储过程,不同的是执行存储过程要使用 CALL 语句来调用,而触发器的执行不需要使用 CALL 语句来调用,也不需要手工启动,只要一个预定义的事件发生就会被 MySQL自动调用。

在实际使用中,MySQL 所支持的触发器有三种:

  1. INSERT 触发器、
  2. UPDATE 触发器和
  3. DELETE 触发器。

    DELIMITER:改变输入的结束符,默认情况下输入结束符是分号;,这里把它改成了两个分号;;,这样做的目的是把多条含分号的语句做个封装,全部输入完之后一起执行,而不是一遇到默认的分号结束符就自动执行;

DROP TRIGGER IF EXISTS `tri_insert_user`;
DELIMITER ;;
CREATE TRIGGER `tri_insert_user` AFTER INSERT ON `user` FOR EACH ROW begin
    INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (new.id, 'add a user',  now());
end
;;
DELIMITER ;
DROP TRIGGER IF EXISTS `tri_update_user`;
DELIMITER ;;
CREATE TRIGGER `tri_update_user` AFTER UPDATE ON `user` FOR EACH ROW begin
    INSERT INTO user_history(user_id,operatetype, operatetime) VALUES (new.id, 'update a user', now());
end
;;
DELIMITER ;

new:当触发插入和更新事件时可用,指向的是被操作的记录

old: 当触发删除和更新事件时可用,指向的是被操作的记录

view视图

  • 作用提高代码重用率
             create view other as select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;
  • 对于重构数据库有帮助;例如将一张表分成不同字段的两张数据表
             create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name;
  • 提高安全性
          create view others as select a.name,a.sex from user as a
  • 让数据更加清晰:想要什么样的数据就创建什么样的表

作者:零岁的我
链接:https://www.jianshu.com/p/4f0d3e552a49