MySQL存储过程、触发器、视图
程序员文章站
2022-06-04 08:41:36
...
文章目录
MySQL存储过程、触发器、视图
一、存储过程
1.什么是存储过程?
- ⽬前使⽤的⼤多数SQL语句都是针对⼀个或多个表的单条语句。并⾮所有操作都这么简单,经常会有⼀个完整的操作需要多条语句 才能完成。
- 存储过程就像脚本语⾔中函数定义⼀样。
- 储存过程是⼀组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,在需要时直接调⽤。
2.创建存储过程
\d // 修改MySQL默认的语句结尾符 ; ,改为 // 。
create procedure创建语句
begin 和 end 语句用来限定存储过程体
\d //
create procedure p1 (这里面可以根据需要可以放参数)
begin
set @i=10;
while @i<90 do
"这里写SQL语句"insert into users values(null,concat('user:',@i),@i,0);
set @i=@i+1;
end while;
end;
//
3.执行存储
call p1()
4.查看存储过程
show create procedure p1 \G
5.删除存储过程
drop procedure p1
二、触发器
- MySQL语句在需要时被执⾏,存储过程也是如此。
- 触发器是MySQL响应写操作(增、删、改)⽽⾃动执⾏的⼀条或⼀组定义在BEGIN和END之间的MySQL语句。
- 就像JavaScript中的事件一样
1.触发器语法
create trigger trigger_name trigger_time trigger_event on tbl_name for each row trigger_stmt
# trigger_name: 触发器名称
# trigger_time: 触发时间,取值:defore 或 after
# trigger_event: 触发事件,取值 insert、delete、update
# tbl_name: 指定在哪个表上
# trigger_stmt: 触发处理的sql 语句
查看所有的 触发器
show triggers \G
删除触发器
drop trigger trigger_name;
Demo
- 如果触发器中的SQL有语法错误,整个操作会报错
-- 创建⼀个删除的触发器,在users表中删除数据之前,往del_users表中添加⼀个数据
-- 1,复制当前的⼀个表结构
create table del_users like users;
-- 2,创建 删除触发器 注意在创建删除触发器时,只能在删除之前才能获取到old(之前的)数据
\d //
create trigger deluser before delete on users for each row
begin
insert into del_users values(old.id,old.name,old.age,old.account);
end;
//
\d ;
tips:
在INSERT触发器代码内,可引⽤⼀个名为NEW的虚拟表,访问被 插⼊的⾏;
在DELETE触发器代码内,可以引⽤⼀个名为OLD的虚拟表,访问被删除的⾏;
OLD中的值全都是只读的,不能更新。
在AFTER DELETE的触发器中⽆法获取OLD虚拟表
在UPDATE触发器代码中
可以引⽤⼀个名为OLD的虚拟表访问更新以前的值
可以引⽤⼀个名为NEW的虚拟表访问新 更新的值;
三、视图
1.什么是视图
- 视图是虚拟的表。与包含数据的表不⼀样,视图只包含使⽤时动态检索数据的查询。
- 视图仅仅是⽤来查看存储在别处的数据的⼀种设施或⽅法。
- 视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的
- 在添加或更改这些表中的数据时,视图将返回改变过的数据。
- 因为视图不包含数据,所以每次使⽤视图时,都必须处理查询执⾏时所需的任⼀个检索。
- 如果你⽤多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能下降得很厉害。
2.视图的作用
- 重用SQL语句
- 简化复杂的SQL操作。在编写查询后,可以方便的重用它而不用知道它是怎么查的
- 使用表的组成部分而不是整个表
- 保护数据,可以给用户授予表的特定部分的访问权限而不是整个表的访问权限
- 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据
- 视图不能索引,不能有关联的触发器或默认值
3.视图的基础语法
创建视图:
create view v_users as select id,name,age form users where age>=25 and age<=35;
vier视图的帮助信息
mysql> ? view
alter view
create view
drop view
查看当前库中所有的视图
show tables; – 可以查看所有的表和视图
show table status where comment=‘view’; – 只查看当前库中的所有视图
删除视图 v_t1 :
drop view v_t1;