存储过程批量删除多个子表中的重复数据

2023-11-29 19:08

本文主要是介绍存储过程批量删除多个子表中的重复数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

``````
use database;
set names utf8;-- 删除客户表子表中的重复数据
DELIMITER //
drop procedure if exists delFieldPro// 
CREATE PROCEDURE delFieldPro()  
BEGIN  DECLARE tableName varchar(100) default '';   DECLARE done INT DEFAULT 0;  DECLARE taskCursor CURSOR FOR select table_name from information_schema.tables where table_schema='uc_ipcc_cloud_ai' and table_name like  'tb_customer_%' and table_name not like  'tb_customer_contact%' ;  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  OPEN taskCursor;  REPEAT  FETCH taskCursor INTO tableName;  IF not done THEN  set @sql0=concat('delete from tb_tmp;') ;PREPARE stmt0 from @sql0; execute stmt0;set @sql=concat('insert into tb_tmp select t.id from ( select max(id) id,customer_nbr,count(1) cu from ',tableName,'  group by customer_nbr having cu>1) t') ;PREPARE stmt from @sql; execute stmt;set @sql1=concat('delete from ',tableName,'  where id in (select id from tb_tmp)');PREPARE stmt1 from @sql1; execute stmt1;END IF;  UNTIL done END REPEAT;  CLOSE taskCursor;
END 
//
DELIMITER ;
CALL delFieldPro();-- 给客户子表添加唯一索引
DELIMITER //
drop procedure if exists addUniqueIndexPro// 
CREATE PROCEDURE addUniqueIndexPro()  
BEGIN  DECLARE tableName varchar(100) default '';   DECLARE done INT DEFAULT 0;  DECLARE taskCursor CURSOR FOR select table_name from information_schema.tables where table_schema='database' and table_name like  'tb_customer_%' and table_name not like  'tb_ucpaas_customer_contact%' ;  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  OPEN taskCursor;  REPEAT  FETCH taskCursor INTO tableName;  IF not done THEN  set @sql0=concat('ALTER TABLE  ',tableName,' ADD unique(customer_nbr);') ;PREPARE stmt0 from @sql0; execute stmt0;      END IF;  UNTIL done END REPEAT;  CLOSE taskCursor;
END 
//
DELIMITER ;
CALL addUniqueIndexPro();-- 找出客户表中含有重复号码的表
DELIMITER //
drop procedure if exists proc_find_repeatNum;
create procedure proc_find_repeatNum (out sum varchar(1000))
BEGINDECLARE tableName varchar(100) default '';   DECLARE done INT DEFAULT 0; DECLARE _num int DEFAULT 0;DECLARE taskCursor CURSOR FOR select table_name from information_schema.tables where table_schema='database' and table_name like  'tb_customer_%' and table_name not like  'tb_ucpaas_customer_contact%' ;  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  OPEN taskCursor;  REPEAT  FETCH taskCursor INTO tableName;  IF not done THEN  set @x ='';set @sql0=concat('select count(1) into @tnum from  (select customer_nbr,count(1) cu from ',tableName,' group by customer_nbr having cu>1) t;') ;PREPARE stmt0 from @sql0; execute stmt0;  deallocate prepare stmt0;SET _num = @tnum;if(_num > 0)then  SET sum= concat(tableName,',');END IF;END IF;  UNTIL done END REPEAT;  CLOSE taskCursor;
end
//
DELIMITER ;
call proc_find_repeatNum(@sum);
-- 查询结果集
select @sum;---删除某张表的重复数据
select count(1) from  (select customer_nbr,count(1) cu from tb_customer_ddd92456d085c9dd4976b59c90e48de6 group by customer_nbr having cu>1) t;
delete from tb_tmp;
insert into tb_tmp select t.id from ( select max(id) id,customer_nbr,count(1) cu from tb_customer_ddd92456d085c9dd4976b59c90e48de6  group by customer_nbr having cu>1) t ;
delete from tb_customer_ddd92456d085c9dd4976b59c90e48de6 where id in (select id from tb_tmp);``````

-- 删除多余索引
DELIMITER //
drop procedure if exists delUniqueIndexPro// 
CREATE PROCEDURE delUniqueIndexPro()  
BEGIN  DECLARE tableName varchar(100) default '';   DECLARE done INT DEFAULT 0;  DECLARE taskCursor CURSOR FOR select table_name from information_schema.tables where table_schema='uc_ipcc_cloud_ai' and table_name like  'tb_ucpaas_customer_%' and table_name not like  'tb_ucpaas_customer_contact%' ;  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  OPEN taskCursor;  REPEAT  FETCH taskCursor INTO tableName;  IF not done THEN  IF EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema='uc_ipcc_cloud_ai' AND table_name = tableName AND index_name = 'customer_nbr_2') THENset @sql0=concat('ALTER TABLE  ',tableName,' drop index customer_nbr_2 ;') ;PREPARE stmt0 from @sql0; execute stmt0; END IF;IF EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema='uc_ipcc_cloud_ai' AND table_name = tableName AND index_name = 'customer_nbr_3') THENset @sql0=concat('ALTER TABLE  ',tableName,' drop index customer_nbr_3;') ;PREPARE stmt0 from @sql0; execute stmt0; END IF;IF EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema='uc_ipcc_cloud_ai' AND table_name = tableName AND index_name = 'customer_nbr_4') THENset @sql0=concat('ALTER TABLE  ',tableName,' drop index customer_nbr_4;') ;PREPARE stmt0 from @sql0; execute stmt0; END IF;IF EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema='uc_ipcc_cloud_ai' AND table_name = tableName AND index_name = 'idx_customer_nbr') THENset @sql0=concat('ALTER TABLE  ',tableName,' drop index idx_customer_nbr;') ;PREPARE stmt0 from @sql0; execute stmt0; END IF;  END IF;UNTIL done END REPEAT;  CLOSE taskCursor;
END 
//
DELIMITER ;
CALL delUniqueIndexPro();

这篇关于存储过程批量删除多个子表中的重复数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/433964

相关文章

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

SpringBoot整合easy-es的详细过程

《SpringBoot整合easy-es的详细过程》本文介绍了EasyES,一个基于Elasticsearch的ORM框架,旨在简化开发流程并提高效率,EasyES支持SpringBoot框架,并提供... 目录一、easy-es简介二、实现基于Spring Boot框架的应用程序代码1.添加相关依赖2.添

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

shell脚本自动删除30天以前的文件(最新推荐)

《shell脚本自动删除30天以前的文件(最新推荐)》该文章介绍了如何使用Shell脚本自动删除指定目录下30天以前的文件,并通过crontab设置定时任务,此外,还提供了如何使用Shell脚本删除E... 目录shell脚本自动删除30天以前的文件linux按照日期定时删除elasticsearch索引s

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.