mysql union 后 sum_闲话Mysql之数据的深拷贝与浅拷贝

aea9066ef7b52ed87f2439a1191d9cd8.png

工作中我们所接触到的数据库呢其中所含有的数据量往往是非常大的,跟平时我们自己练习的时候的样本数据完全不是一个量级,而我们的工作却往往不需要查看所有的数据,只需要从表中调取特定的数据保存下来留作下次查看即可,这个也称之为“拷贝(copy)”,这个时候我们就需要使用到Mysql里面的视图功能了,即 create view语句,比如现在有这么一个表格:

4542ac41d57b0642b7d1e3c78aac9c89.png

我们的工作就是查看sid=01的同学的相关信息,我们就不需要每次都去用

"select * from sc where sid=01",而可以键入

create view sid_01 as 
select * from sc 
where sid=01;

系统自动就会永久保存一个名为sid_01的视图,如果你下次调取数据的时候直接

"select * from sid_01" 就可以了

7a19c816770a283911afe80cc08c07bd.png

但需要注意的一点是,视图属于表的浅拷贝,什么意思呢?就是好比,数据表A是一盒子的巧克力,上面贴这个标签A,现在创建一个视图叫a,这个a的标签也是贴在同一个盒子上面的,所以视图和表的数据变动是联动的,如果你改了数据表或者视图二者当中任意一方的数据,另外一方的数据就会跟着变动,这就是所谓的“浅拷贝”。不过当你在创建视图时create view语句中涉及了从数据表中抓取类似sum、min、max count、distinct、group by having、union(union all)之类的关键词时,view的主动更新操作(update)是不可用的,系统会报错,但是不影响表的更新。

假如我们想的是要创建一个数据和源表格不联动的视图该咋整?其实也有办法,Mysql数据库支持一种叫做临时表(temporary table)的功能,即你通过create temporary table语句从源表格拷贝数据后系统会生成一个临时的表格,下面是代码示例:

create temporary table copy1
as select * from sc
where sid=01;

这个临时的表格和视图主要有两个区别:第一,临时表格的数据和源表格的数据是不联动的;第二,临时表只存在于当前的连接,你要是退出连接的话临时表就会被系统自动清除从而释放内存。这个临时表的功能我把它叫做“临时深拷贝”。

现在又假如我们不想要它是一个临时性的表格,也不想要它的数据跟源表格是联动的,这又该咋整捏~要我说,直接干脆再建立一个新表格就好了,你可能会觉得这个很麻烦,其实创建表也可以通过快捷方法来创建的啊,比如:

create table copy1
as select * from sc
where sid=01;

这样就可以了~

一般情况啊,如果你在一段时间内只需要查看特定模块的实时数据,这个时候你就用视图功能,如果你想要看特定模块当时的数据,且就在一小段时间内反复看的话,那就用临时表功能,如果你留着长期有用么,就直接再新建一个表就可以了。以上都是本人的拙见,仅供参考哈~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值