简介
这里我想说的是,程序本身不需要关心表的结构,只需要按照视图定义来取数据或更新数据。
什么是视图
说起视图呢,就是说它相当于一个虚拟的表,你看不到它,但是你可以根据它来更新和操作表,视图中的with check option就是针对于可更新的视图的
例子
首先我们来创建一个叫做t的表,然后再创建一个视图,这个视图当中的数据是和t表相关的,也就是对这个表进行了一个限制
create table t (id int);
create view v_t
as
select * from t where id< 10;
如上图代码所示,就是说你在插入数据的时候id不能大于或等于10,如果大于或等于的话,就会不成功,不信我?那你看看下面的代码和结果把~
insert into t select 20;
select * from v_t;
上图显示,查找数据的时候为空,但是我是插入进去了啊,这里就是视图书写的问题了,我们都知道,视图要求的是id不能大于或者等于10,否则就不会有结果,于是呢,我们可以在这个视图当中设置相应的check option,使得它在插入语句输入之后就会自动弹出对应的错误信息,不信我们来看代码和截图
看到没有!就是这样的!
查看一个数据库中的表和视图
查看视图
物化视图
优点:
当遇到一些很繁琐的操作计算的时候,物化视图可以预先计算,这样就大大地降低了时间。
特点:
Mysql本身并不支持物化视图,换句话来说,不同于oracle,mysql中的视图总是虚拟的。
物化步骤
首先,我们想要通过物化视图的方式来减轻计算量和提高效率,那么我们需要做的就是先去创建一个表,这个表中的信息可以是这样的:
Orders:
create table Orders
(
order_id int unsigned not null auto_increment,
product_name varchar(30) not null,
price decimal(8,2) not null,
amount smallint not null,
primary key (order_id)
)engine=InnoDB;
向里面插入:
insert into Orders values
(NUll,'CPU',135.5,1),
(NULL,'Memory',48.2,3),
(NULL,'CPU',124.5,2),
(NULL,'CPU',124.2,6)
;
接着我们再来创建一张物化视图的基表,用来统计每件物品的信息,如:
create table Orders_MV(
product_name varchar(30) not null,
price_sum decimal(8,2) not null,
amount_sum int not null,
price_avg float not null,
orders_cnt int not null,
unique index(product_name)
);
insert into Orders_MV
select product_name,sum(price),sum(amount),avg(price),count(*)
from Orders
group by product_name;
接下来就是验证一下
创建一个触发器
先说说我们为什么要创建这个触发器呢?那就是我们每次在进行这个插入订单表当中的信息的时候,要保证基表中的值也要跟着进行变化,那么就要进行一个触发器的创建了
//触发器
create trigger tgr_Orders_insert
after insert on Orders
for each row
begin
set @old_price_sum=0;
set @old_amount_sum=0;
set @old_price_avg=0;
set @old_orders_cnt=0;
select ifnull(price_sum,0),ifnull(amount_sum,0),ifnull(price_avg,0),ifnull(orders_cnt,0)
from Orders_MV
where product_name=NEW.product_name
into @old_price_sum,@old_amount_sum,@old_price_avg,@old_orders_cnt;
set @new_price_sum=@old_price_sum+NEW.price;
set @new_amount_sum=@old_amount_sum+NEW.amount;
set @new_orders_cnt=@old_orders_cnt+1;
set @new_price_avg=@new_price_sum+NEW.price;
REPLACE into orders_MV
values(NEW.product_name,@new_price_sum,@new_amount_sum,@new_price_avg,@new_orders_cnt);
END;
$$
接下来要注意的就是当你想要以;号结束的话,还需要做的就是
DELIMITER ;
紧接着进行一个验证:
insert into Orders values (NULL,‘SSD’,299,3);
insert into Orders value (NULL,‘Memory’,477,5);
结语
通过这一期文章的学习,我也算是掌握了很多吧,首先是视图上的学习,然后就是物化视图,但是Mysql数据库本身不支持物化视图,因此对于物化视图就显得无能为力,用户只能在应用程序端做一些控制。我是明怀,今天不知道怎么回事,感觉累累(蕾蕾)的,嘿嘿,我们下期见啦!