php+sql后台实现从主表迁出至副表(数据超万条)
上万条甚至上百万数据进行迁出做备份或者进行不妨碍原系统数据的操作,现在很多企业都会用到,目前就需要将上百万条数据进行迁出到副表保存并操作,直接再后台写一个按钮进行操作,既方便操作也不会很慢。毕竟是客户需要,不能每次迁出都要客户去数据库操作,操作的不好那数据危险度挺高的。
1、分页查询数据库主表数据
2、分页写入数据库副表
两句话很简单,关键在于那个“分页”式操作,那这就开始我这上百万条的数据迁出作业 by user 悦悦 https://www.cnblogs.com/nuanai
前端肯定需要一个页面来显示这个操作按钮,html的页面布局不做多余解释(使用的框架是fastadmin)页面显示了运行到的每一页数据和运行结束后总页数
1 <p>当前页码:<span id="currentPage"></span></p> 2 <p>总页数:<span id="totalPage"></span></p> 3 4 <button type="button" id="qrBtntwo">迁出数据</button>
再来就是JS逻辑问题,html给这个按钮起了一个名字,那就对这个名字进行单击事件的触发 by user 悦悦 https://www.cnblogs.com/nuanai
需要注意的是我这边调用导入数据方法,使用的Controller调用方法,因为我使用的是fastadmin框架,正常根据自己所使用的的框架进行方法的调用就可以。
1 $(document).on("click", "#qrBtntwo", function () { 2 // 初始化页码和总页数 3 $('#currentPage').text(1); 4 $('#totalPage').text('正在导入...'); 5 6 // 开始导入数据,默认是第一页 7 Controller.importProewm(1); 8 });
数据导入方法的编写,用到了ajax方法,也不过多解释,正常的结构传值,只要url路径写对即可(如果需要判定时间性操作,可以追加上时间点的判断和传值data),注意需要用到get传值当前页数page,因为下面返回需要继续调用
1 importProewm:function(page){ 2 $.ajax({ 3 url: 'bwqr/Workflowhis/importproewm?page=' + page, 4 type: 'POST', 5 dataType: 'json', 6 success: function(res) {20 }, 21 error: function(xhr, status, error) { 22 // 显示错误信息 23 alert('数据导入失败:' + error); 24 } 25 }); 26 },
对于控制器的内容,就是每次读取数据库数据,按照分页进行读取后写入到副表中,然后将“页数”和"总页数"结果返回到JS中,里面使用到了事务的开启,如果出现错误可以很好的判断是哪一页出现了错误 by user 悦悦 https://www.cnblogs.com/nuanai
1 public function importproewm(){ 2 3 // 每页显示的数据量 4 $pageSize = 10; 5 // 获取当前页码 6 $page = isset($_GET['page']) ? intval($_GET['page']) : 1; 7 // 查询原始表的数据总数 8 $query = Db::name('procedure'); 9 $total = $query->count(); 10 // 计算总页数 11 $totalPage = ceil($total / $pageSize); 12 // 开启事务 13 Db::startTrans(); 14 try { 15 // 查询当前页的数据并插入到目标表 16 $data = $query->where(["deletetime"=>null,"status"=>'normal'])->limit($pageSize)->page($page)->select(); 17 Db::name('procedure_his')->insertAll($data, true);//相同id的跳过 18 19 // 构建返回的JSON数据 20 $responseData = [ 21 'currentPage' => $page, 22 'totalPage' => $totalPage 23 ]; 24 // 提交事务 25 Db::commit(); 26 } catch (\Exception $e) { 27 // 回滚事务 28 Db::rollback(); 29 $this->error($e->getMessage()); 30 // 返回错误信息 31 header('HTTP/1.1 500 Internal Server Error'); 32 echo '数据导入失败:' . $e->getMessage(); 33 } 34 35 $this->success('', null, $responseData); 36 }
JS循环调用importProewm方法即可:如果按照页数进行循环,就需要传入每一页的页数值,因此自己调用自己的时,需要传入页数值+1才可以实现页数循环;里面也进行了页数判断,如果没有了下一页,就会输出完成提示
1 var response = res.data; 2 console.log(response); 3 // 更新当前页码和总页数 4 $('#currentPage').text(response.currentPage); 5 $('#totalPage').text(response.totalPage); 6 7 // 判断是否还有下一页数据 8 if (response.currentPage < response.totalPage) { 9 // 继续导入下一页数据 10 Controller.importProewm(response.currentPage + 1); 11 } else { 12 // 导入完成 13 $('#totalPage').text(response.totalPage + ' (导入完成)'); 14 }
至此,从主表迁出到副表功能就结束了,总结其实就是合理对自己的调用。 by user 悦悦 https://www.cnblogs.com/nuanai
如果大家有更简单的主副表迁移 ,可以一起沟通。