php+sql后台实现从主表迁出至副表(数据超万条)

php,sql · 浏览次数 : 0

小编点评

本文介绍了一种高效迁移大量数据的方法,通过分页查询和分页写入数据库来实现。这种方法适用于企业需要将上百万条数据迁出到副表进行备份或操作的场景。文章首先提出了需求背景,然后详细描述了实现过程,包括前端页面布局、JavaScript交互和后端控制器方法。 1. **需求背景**: 本文针对客户对数据迁移的需求,提出了一种简便且快速的方法来解决这一问题。由于数据量庞大,直接在数据库中进行操作可能导致数据损坏风险,因此需要采用一种分页处理的方式。 2. **实现过程**: - **前端页面布局**:使用FastAdmin框架创建一个包含分页按钮、当前页码和总页数的HTML页面。 - **JavaScript交互**:通过JavaScript监听分页按钮的点击事件,实现数据的迁出操作。 - **后端控制器方法**:编写Controller方法,用于处理前端发送的请求,包括分页查询主表数据、分页写入副表数据以及返回分页信息和错误处理。 3. **具体实现**: - **分页查询数据库主表数据**:通过查询语句获取指定页的数据,同时计算总页数。 - **分页写入数据库副表**:将查询到的数据插入到副表中,并确保相同ID的数据不会被重复插入。 - **数据导入方法的编写**:使用Ajax方法向后端发送请求,传递当前页码等信息。 - **控制器的实现**:编写Controller方法,处理前端发送的请求,包括查询、插入和事务管理。 4. **优化与注意事项**: - 在编写控制器方法时,需要注意事务的处理,以确保数据的一致性。 - 在实现分页查询时,要考虑到性能优化,避免一次性查询过多数据导致系统性能下降。 - 在前端页面布局中,要简洁明了地展示数据迁移的相关信息,提高用户体验。 总结来说,本文提供了一种简便、快速的数据迁移方案,通过合理的分页处理和前后端协同工作,实现了大量数据的迁移任务,同时也考虑到了数据一致性和系统性能。

正文

上万条甚至上百万数据进行迁出做备份或者进行不妨碍原系统数据的操作,现在很多企业都会用到,目前就需要将上百万条数据进行迁出到副表保存并操作,直接再后台写一个按钮进行操作,既方便操作也不会很慢。毕竟是客户需要,不能每次迁出都要客户去数据库操作,操作的不好那数据危险度挺高的。

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

 如果大家有更简单的主副表迁移 ,可以一起沟通。

与php+sql后台实现从主表迁出至副表(数据超万条)相似的内容: