这里我想说的是,程序本身不需要关心表的结构,只需要按照视图定义来取数据或更新数据。
说起视图呢,就是说它相当于一个虚拟的表,你看不到它,但是你可以根据它来更新和操作表,视图中的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数据库本身不支持物化视图,因此对于物化视图就显得无能为力,用户只能在应用程序端做一些控制。我是明怀,今天不知道怎么回事,感觉累累(蕾蕾)的,嘿嘿,我们下期见啦!