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后台实现从主表迁出至副表(数据超万条)相似的内容:

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

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

PHP 程序员为什么依然是外包公司的香饽饽?

PHP 唯一的爽点就是开发起来「哇真快」这刚好和外包公司的需求相契合,在 Web 领域的芒荒年代 PHP 以王者姿态傲视群雄。

硬核案例分享,一文带你拆解PHP语言体系下的容器化改造

本文介绍了PHP语言体系应用现代化案例,实现了许多与业务无关的通用性应用改造方案,如PHP应用容器化架构方案、基于Prometheus的弹性伸缩方案等等,为此类型客户提供了一个可参考的案例。

PHP 真的不行了?透过 PHP 的前世今生看真相

大家好,我是码农先森。 1994年我出生在湖南的农村,就在同年加拿大的拉斯姆斯·勒多夫创造了 PHP,这时的 PHP 还只是用 Perl 编写的 CGI 脚本。或许是时间的巧合 PHP 变成了我后半生谋生的手段,当时拉斯姆斯·勒多夫写这些脚本的目的,只是为了统计自己网站的访问者。就是这样一个简单的目

php反序列化个人笔记

反序列化 什么是反序列化? 格式转换 序列化:对象转换为字符串或者数组等格式 反序列化:将数组或字符串转换成对象 为什么会出现安全漏洞? 魔术方法 如何利用漏洞? 通过构造pop链,找到代码的逻辑漏洞,进行getshell,rce等操作 反序列化利用分为三类 魔术方法的调用逻辑 语言原生类的调用逻辑

七年之痒!一个 PHP 程序员职业生涯的自述

作为一名程序员常常都是与代码为伴,平常写个技术文档或PPT都费劲的人,竟然不知不觉地写了这么多文字,我也是感到十分的惊讶。17年毕业到今年刚好七年了,俗话说七年之痒,这一次的自述也算是对自己一个职业生涯的复盘了。

PHP转Go系列 | ThinkPHP与Gin框架之OpenApi授权设计实践

工作中只要接触过第三方开放平台的都离不开 OpenApi,几乎各大平台都会有自己的 OpenApi 比如微信、淘宝、京东、抖音等。在 OpenApi 对接的过程中最首要的环节就是授权,获取到平台的授权 Token 至关重要。

PHP 程序员是学 Swoole ?还是学 Go ?

这次为什么要讨论这个话题,因为 Swoole 和 Go 在 PHP 程序员坊间一直都是茶语饭后的谈资,觉得懂 Swoole 和 Go 的就高人一等。

【PHP】关于fastadmin框架中使用with进行连表查询时setEagerlyType字段的理解

FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一款开源且免费商用的后台开发框架,它基于ThinkPHP和Bootstrap两大主流技术构建的极速后台开发框架,它有着非常完善且强大的功能和便捷的开发体验,使我逐渐喜欢上了它。

PHP转Go系列 | ThinkPHP与Gin框架之API接口签名设计实践

大家好,我是码农先森。 回想起以前用模版渲染数据的岁月,那时都没有 API 接口开发的概念。PHP 服务端和前端 HTML、CSS、JS 代码混合式开发,也不分前端、后端程序员,大家都是全干工程师。随着前后端分离、移动端开发的兴起,用后端渲染数据的开发方式效率低下,已经不能满足业务对需求快速上线的要