vlambda博客
学习文章列表

Mysql(三) 视图和触发器



视图

1. 视图 

    1.1 视图概述 

            视图(View)是一种虚拟存在的表。视图并不在数据库中实际存在,行和列数据来自定义视图的查询 中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图就是一条SELECT语句执行后返回的结果 集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

         视图相对于普通的表的优势主要包括以下几项。                

    • 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已 经是过滤好的复合条件的结果集。

    •  安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某 个列,但是通过视图就可以简单的实现。

    •  数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影 响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

    1.2 创建或者修改视图 创建视图的语法为:

-- 创建视图create view 视图名assql语句;-- 创建视图create view view_city_countryasselect c.*,cou.country_name from city c,country cou where c.country_id=cou.country_id;

    1.3查看视图

-- 查看视图show tables;-- 使用视图select * from 视图名;select city_name,country_name from view_city_country;-- 通过视图修改数据update view_city_country set city_name='西安市' where city_id=1;-- 查看视图的定义show create view 视图名;

    1.4删除视图

-- 删除视图drop view view_city_country;



触发器

2. 触发器 

    2.1 介绍 

            触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,触发并执行触发器中定义的 SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性 , 日志记录 , 数据校验等操 作 。 

            使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器 还只支持行级触发,不支持语句级触发.


触发器类型 NEW 和 OLD的使用
INSERT 型触发器 NEW 表示将要或者已经新增的数据
UPDATE 型触发器 O OLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据
DELETE 型触发器 OLD 表示将要或者已经删除的数据

    2.2 创建触发器

-- 创建emp_logs日志表create table emp_logs( id int(11) not null auto_increment, operation varchar(20) not null comment '操作类型, insert/update/delete', operate_time datetime not null comment '操作时间', operate_id int(11) not null comment '操作表的ID', operate_params varchar(500) comment '操作参数', primary key(`id`))engine=innodb default charset=utf8;-- 创建触发器,影响emp表的数据时记录日志-- 给emp添加数据的同时给emp_logs表添加一条数据-- 添加时触发create trigger triger_emp_insertafter inserton empfor each rowbegin insert into emp_logs(id,operation,operate_time,operate_id,operate_params)  values(null,'insert',NOW(),new.id, concat('插入的数据(id:',new.id,'name:',new.name,'age:',new.age,'salary:',new.salary,')'));end

    创建 update 型触发器,完成更新数据时的日志记录

-- 触发器的使用-- 修改时触发create trigger trigger_emp_updateafter updateon empfor each rowbegin insert into emp_logs(id,operation,operate_time,operate_id,operate_params)  values(null,'update',NOW(),old.id, concat('修改前(id:',old.id,',name:',old.name,',age:',old.age,',salary:',old.salary,')', '修改后(id:',new.id,',name:',new.name,',age:',new.age,',salary:',new.salary,')'));end

        创建delete 行的触发器 , 完成删除数据时的日志记录 :

create trigger emp_logs_delete_triggerafter deleteon empfor each rowbegininsert into emp_logs (id,operation,operate_time,operate_id,operate_params)values(null,'delete',now(),old.id,concat('删除前(id:',old.id,',name:',old.name,', age:',old.age,', salary:',old.salary,')'));end

    2.3 删除触发器

drop trigger 触发器名称;


    2.4 查看触发器

show triggers