Mysql重要内容(视图以及物化视图)

简介

这里我想说的是,程序本身不需要关心表的结构,只需要按照视图定义来取数据或更新数据。

什么是视图

说起视图呢,就是说它相当于一个虚拟的表,你看不到它,但是你可以根据它来更新和操作表,视图中的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;

Mysql重要内容(视图以及物化视图)

上图显示,查找数据的时候为空,但是我是插入进去了啊,这里就是视图书写的问题了,我们都知道,视图要求的是id不能大于或者等于10,否则就不会有结果,于是呢,我们可以在这个视图当中设置相应的check option,使得它在插入语句输入之后就会自动弹出对应的错误信息,不信我们来看代码和截图
Mysql重要内容(视图以及物化视图)
看到没有!就是这样的!

查看一个数据库中的表和视图

Mysql重要内容(视图以及物化视图)
Mysql重要内容(视图以及物化视图)

查看视图

Mysql重要内容(视图以及物化视图)

物化视图

优点:
当遇到一些很繁琐的操作计算的时候,物化视图可以预先计算,这样就大大地降低了时间。
特点:
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)
;

Mysql重要内容(视图以及物化视图)
接着我们再来创建一张物化视图的基表,用来统计每件物品的信息,如:

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;

接下来就是验证一下
Mysql重要内容(视图以及物化视图)

创建一个触发器

先说说我们为什么要创建这个触发器呢?那就是我们每次在进行这个插入订单表当中的信息的时候,要保证基表中的值也要跟着进行变化,那么就要进行一个触发器的创建了

//触发器
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重要内容(视图以及物化视图)

结语

通过这一期文章的学习,我也算是掌握了很多吧,首先是视图上的学习,然后就是物化视图,但是Mysql数据库本身不支持物化视图,因此对于物化视图就显得无能为力,用户只能在应用程序端做一些控制。我是明怀,今天不知道怎么回事,感觉累累(蕾蕾)的,嘿嘿,我们下期见啦!

上一篇:Ubuntu12.04运行spec2000测试(小马的学习笔记一)


下一篇:java 自学