视图:是一个虚拟表,编译好的sql语句,随着表的改变而改变;使用视图会增加解析时间,降低效率。
存储过程:预先编译好的一批sql语句,会在服务器端注册并优化,效率高。
触发器:一个表数据更新后,通过触发器来修改与其关联的其它表,保持数据的一致性。(如A表中有B表的id,但没用外键约束,当B表删除后,要求A表相应字段设为0,可以用函数解决,但如果与B关联的表很多,就可以用到触发器)
给user表建立视图u:(mysql环境)
create view u as select * from user
建立存储过程,将user中具有指定id的数据插入到person_name表中:
mysql>delimiter $ //因为mysql定界符(结束符)为分号,而存储过程中往往会有分号,这里将定界符改为$
接下来begin 创建存储过程p,输入命名为IN 是一个bigint类型的值;输出命名为OUT 是一个varchar类型的值
写插入数据的sql,end
create procedure p(IN userid bigint(20),OUT userName varchar(50))
begin
select * from user;
select user.userName into person_name form user where user.id =userid;//条件为user的id等于输入的userid
end
$
创建触发器语法如下:
- CREATE TRIGGER trigger_name trigger_time trigger_event
- ON tbl_name FOR EACH ROW trigger_stmt
■ trigger_name:标识触发器名称,用户自行指定;
■ trigger_time:标识触发时机,用before和after替换;
■ trigger_event:标识触发事件,用insert,update和delete替换;
■ tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
■ trigger_stmt:触发器程序体。可以用Begin End开始结束,中间可用IF else等做处理
create trigger t1 after insert on records for each row update Rweek set Rweek.Wincome=Rweek.Wincome+NEW.income,Rweek.Wexpend=Rweek.Wexpend+NEW.expend where Rweek.week=NEW.week;