视图 触发器 存储过程
标签(空格分隔): MySQLday04 视图 触发器 存储过程
视图
试图是一个虚拟表,是从数据库中一个或者多个表中导出来的表。视图还可以从已经存在的视图的基础上定义
视图的作用
- 简单性
- 安全性
- 逻辑数据独立性
创建视图
CREATE VIEW 视图名
AS <select statement>
实例
create view view_sellSet as
select c.c_name as 商品名称 ,c.c_madein as 商品产地,ct.ct_name as 商品类型 , c.c_outprice as 商品售价 from commodity as c inner join commoditytype as ct on c.c_type=ct.ct_id where c.c_outprice is not null;
从以上的视图中可以看出我们能够将所需要的信息进行展示而不需要展示的信息进行隐藏
查看视图
- DESCRIBE语句查看视图基本信息查看视图
DESCRIBE 视图名; - SHOW TABLE STATUS语句查看视图基本信息
SHOW TABLE STATUS LIKE ‘视图名’; - SHOW CREATE VIEW语句查看视图详细信息
SHOW CREATE VIEW 视图名; - 查看视图详细信息
select * from information_schema.views;
注意
视图只是一个查询的集合,显然是不能通过视图修改多张基表的,并不能往视图中插入数据或者修改数据,只能往对应的基表中插入数据。
删除视图
DROP VIEW [IF EXISTS] 视图名[,视图名2]...
触发器
它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发
触发器创建语法四要素:
- 1.监视地点(table)
- 2.监视事件(insert/update/delete)
- 3.触发时间(after/before)
- 4.触发事件(insert/update/delete
create trigger tri_test1
after insert on 表名
for each row begin update 表名 set num=num-new.字段名 where 字段名 =new.字段名
创建三个触发器
创建insert触发器 减去commodity中的num
create trigger tri_1
after insert on `order`
for each row
begin
update commodity set c_num=c_num-new.o_num where c_id=new.o_cid;
end$
创建delete触发器将删除的num返回commodity表中
create trigger tri_2
after delete on `order`
for each row
begin
update commodity set c_num=c_num+old.o_num where c_id=old.o_cid;
end$
创建修改触发器使得能够同时就该两个表的num值
create trigger tri_3
after update on `order`
for each row
begin
update commodity set c_num=c_num+old.o_num-new.o_num where c_id=old.o_cid;
end$
存储过程
它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
####作用
大大提高效率(存储过程本身执行速度非常快,调用存 储过程大大减少数据库交互次数);提高代码重用性
create procedure sp_name(proc_parameter[...]) begin [characteristic ...] routine_body end
分为三种存储过程
- 无参参数示例
create procedure pro_queryall()
begin
select * from commodity;
end$
- in参数示例
create procedure pro_ask(in cu_id int(11))
begin
select c_name from commodity where c_id in (select o_cid from `order` where o_cuid=cu_id);
end$
- OUT参数示例
create procedure pro_askcnum(in cid int(11),out cnum int(11))
begin
select c_num into cnum from commodity where c_id=cid;
end$
####增强实例
当c_num<=10 显示库存少 else 库存充足
DELIMITER ;;
CREATE PROCEDURE `insertOrder`(in _o_cuid VARCHAR(50),in _o_cid VARCHAR(50),in _o_num INT,out flag INT(11))
BEGIN
set @_c_num=0;
set autocommit=0;
START TRANSACTION;
INSERT INTO `order` (o_cuid,o_cid,o_num) VALUES (_o_cuid,_o_cid,_o_num);
set @_c_num=(select c_num from commodity where c_id=_o_cid);
IF @_c_num>=0
THEN COMMIT;
SET flag = 1;
else ROLLBACK;
SET flag = 0;
END IF;
set autocommit=1;
END
;;
DELIMITER ;
DELIMITER ;;
CREATE PROCEDURE `updateOrder`(in _o_id INT,in _o_num INT,out flag INT(11))
BEGIN
set @_c_num=0;
set autocommit=0;
START TRANSACTION;
UPDATE `order` SET o_num=_o_num WHERE o_id=_o_id;
set @_c_num=(select c_num from commodity where c_id=(SELECT o_cid FROM `order` WHERE o_id=_o_id));
IF @_c_num>0
THEN COMMIT;
SET flag = 1;
else ROLLBACK;
SET flag = 0;
END IF;
set autocommit=1;
END
;;
DELIMITER ;