数据库数据处理故事多
每年评教都会遇到数据导入的一系列问题。从中收获颇丰。
这两天别人总在问我,你们基础出了什么问题,为什么总在导数据。数据没问题,为了做足准备,我们需要将8期版的最全的数据整理到10期数据库中。
背景介绍:问题在于从8期版基础系统到10期版基础系统在数据库设计方面有了很大的变化,例如10期学生表中存放着班级外键,而8期表中是用第三张表来维护关系的。10期的‘上课班’ 中需要课程和老师的关系,而再8期表中需要多个表才能将其关联起来。 20来张表,各种外键关联,最多的一个表存50多万条数据,怎么做,怎么做快 是摆在我们面前一个迫切需要解决的问题。
故事一:
由于8期表间都是通过第三张表联系起来的。而像1:n的关系10期表基本都是外键之间关联的。
例如,我想在10期表添加学生信息(包括学号,姓名,班级外键等)。我需要先从8期学生表中导出学生信息(不含班级外键)再从班级和学生的第三张表中导出学生和班级的关系,然后一一对比将两个表整合到一张表上去。
这样做是我们最初最天然的想法,当然效率低而且人工核对出错率极高。于是我们改用PlanB。在数据库中建立学生和第三张表的视图,然后将视图导出到excel。
故事二:
建立视图的时候,我们又遇到另一个问题。将两个表联合起来,发现学生总共为22052行,而视图总数为22191 行。如果数据没问题的话,这是不应该出现的。因为按道理来说,学生和班级两个表的n:1关系, 而且表数据无冗余。应该无论做链接还是右链接数据都是一样的。
于是我们用了一个查询语句 select ClassID from BasicClassEntities where ClassID not in(select ClassID from BasicStudentEntities)
先原谅我用了这样一条效率低的查询语句。我们查出来有正好139个班级里面没有学生。后来再研究发现原来这里面有100多虚拟行政班( 是为考试留的),也真的有三个班是由于人为失误没有加上关联。利用表和表之间的关系查询,是真的可以检查错误的,此处就不一一列举了。
故事三:
我想到了之前的一道面试题。于是自己建表实践了一下。如题是:A表有5条数据,B表有8条数据。如果两个表有3条公共数据,那么分别用交叉连接,左右连接能得到多少条数据。
实验一:如图
student 表里的数据。 teacher表里的数据
通过学生表和教师表分别进行右左连接,如图所示。
实验二:如图 在此基础上,将3条公共数据 改为不是一一对应,现在是有两个ID一样都和学生同一ID一致。
显示结果如下。
看!显示内容如下
故事四:
第一次将整理好的数据excel 复制到数据库中的时候,我们采取的方法是将excel字段和数据库字段设置成一致的然后之间 ctrl+c 再ctrl +v 。结果2万多学生需要10多分钟才能导入进去。于是我们利用数据库自带的导入excel功能,发现即便是50万数据也能瞬间搞定。只是导入后会新生成这样一个表。
然后从表数据到另一个表上 使用语句 insert into BasicStudentEntities select * from BasicStudentEntities$ 也是秒秒钟的事。
好玩的故事很多,下节继续~
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。