国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - mysql觸發器實現oracle物化視圖示例代碼

mysql觸發器實現oracle物化視圖示例代碼

2020-03-12 15:26MYSQL教程網 Mysql

mysql觸發器實現oracle物化視圖即不是基于基表的虛表,而是根據表實際存在的實表,需要的朋友可以參考下

oracle數據庫支持物化視圖--不是基于基表的虛表,而是根據表實際存在的實表,即物化視圖的數據存儲在非易失的存儲設備上。 
下面實驗創建ON COMMIT 的FAST刷新模式,在mysql中用觸發器實現insert , update , delete 刷新操作 
1、基礎表創建,Orders 表為基表,Order_mv為物化視圖表 

復制代碼代碼如下:

mysql> create table Orders( 
-> order_id int not null auto_increment, 
-> product_name varchar(30)not null, 
-> price decimal(10,0) not null , 
-> amount smallint not null , 
-> primary key (order_id)); 
Query OK, 0 rows affected 
mysql> create table Order_mv( 
-> product_name varchar(30) not null, 
-> price_sum decimal(8.2) not null, 
-> amount_sum int not null, 
-> price_avg float not null, 
-> order_cnt int not null, 
-> unique index(product_name)); 
Query OK, 0 rows affected 


2、insert觸發器 

復制代碼代碼如下:

delimiter $$ 
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(order_cnt,0) 
from Order_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_orders_cnt; 

replace into Order_mv 
values(new.product_name,@new_price_sum,@new_amount_sum,@new_price_avg,@new_orders_cnt); 
end; 
$$ 
delimiter ; 


3、update觸發器 

復制代碼代碼如下:

delimiter $$ 
create trigger tgr_Orders_update 
before update 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; 

set @cur_price=0; 
set @cur_amount=0; 

select price,amount from Orders where order_id=new.order_id 
into @cur_price,@cur_amount; 

select ifnull(price_sum,0),ifnull(amount_sum,0),ifnull(price_avg,0),ifnull(order_cnt,0) 
from Order_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-@cur_price+new.price; 
set @new_amount_sum=@old_amount_sum-@cur_amount+new.amount; 
set @new_orders_cnt=@old_orders_cnt; 
set @new_price_avg=@new_price_sum/@new_orders_cnt; 

replace into Order_mv 
values(new.product_name,@new_price_sum,@new_amount_sum,@new_price_avg,@new_orders_cnt); 
end; 
$$ 
delimiter ; 


4、delete觸發器 

復制代碼代碼如下:

delimiter $$ 
create trigger tgr_Orders_delete 
after delete 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; 

set @cur_price=0; 
set @cur_amount=0; 

select price,amount from Orders where order_id=old.order_id 
into @cur_price,@cur_amount; 

select ifnull(price_sum,0),ifnull(amount_sum,0),ifnull(price_avg,0),ifnull(order_cnt,0) 
from Order_mv 
where product_name=old.product_name 
into @old_price_sum,@old_amount_sum,@old_price_avg,@old_orders_cnt; 

set @new_price_sum=@old_price_sum - old.price; 
set @new_amount_sum=@old_amount_sum - old.amount; 
set @new_orders_cnt=@old_orders_cnt - 1; 

if @new_orders_cnt>0 then 
set @new_price_avg=@new_price_sum/@new_orders_cnt; 
replace into Order_mv 
values(old.product_name,@new_price_sum,@new_amount_sum,@new_price_avg,@new_orders_cnt); 
else 
delete from Order_mv where product_name=@old.name; 
end if; 
end; 
$$ 
delimiter ; 


5、這里delete觸發器有一個bug,就是在一種產品的最后一個訂單被刪除的時候,Order_mv表的更新不能實現,不知道這算不算是mysql的一個bug。當然,如果這個也可以直接用sql語句生成數據,而導致的直接后果就是執行效率低。 

復制代碼代碼如下:

-> insert into Order_mv 
-> select product_name ,sum(price),sum(amount),avg(price),count(*) from Orders 
-> group by product_name; 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩在线精品 | 欧美福利在线观看 | 日韩精品在线观看视频 | 国产99久久精品 | 精品第一页 | 欧美日韩国产精品一区二区 | 视频精品一区 | 在线观看的av | 亚洲免费精品 | 国产一区二区精品在线观看 | 日韩视频中文字幕 | 天堂色| 精品中文在线 | 成人小视频在线观看 | 国产艹 | 狠狠久 | 国产黄色影视 | 91视频精品| 激情婷婷| 欧美午夜精品久久久久久浪潮 | 午夜精品一区二区三区免费视频 | 国产精品美女 | 操操操av| 国产在线a | 国产精品suv一区二区 | 亚洲视频二区 | 国产黄色免费网站 | 不卡中文一区 | 91久久综合亚洲鲁鲁五月天 | 日韩精品视频在线观看一区二区 | 免费国产wwwwwww网站 | 精品国产一区二区三区av性色 | 99久久精品国产一区二区三区 | 一区二区三区免费在线观看 | 国产日韩欧美在线观看 | 精品久久亚洲 | 4h影院| 中文字幕在线观看视频一区 | 久久久久久久国产精品免费播放 | 欧美成人高清视频 | 亚洲国产中文字幕 |