最近有个需求,给角色添加菜单权限,这是一个role_menu 表。里面存放的是角色id和菜单id,是批量给一种类型角色添加,但有可能角色人为添加过,因为数据量还是比较大的,如果先查询这个有没有添加过再添加会很耗时,而统一不管有没有添加过一并添加则很快,这就需要后续给重复数据给删除掉,于是有了今天的分享。 我这里只做一个列子,工作代码安全底线大家谨记哈。
准备一张表 用的是mysql8 大家自行更改

/*Navicat Premium Data TransferSource Server         : localmysqlSource Server Type    : MySQLSource Server Version : 80030Source Host           : localhost:3306Source Schema         : nie_dbTarget Server Type    : MySQLTarget Server Version : 80030File Encoding         : 65001Date: 17/08/2022 10:49:41
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for message
-- ----------------------------
DROP TABLE IF EXISTS `message`;
CREATE TABLE `message`  (`id` bigint(0) NOT NULL,`message_title` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,`message_context` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,`send_peo` bigint(0) NULL DEFAULT NULL,`receive_peo` bigint(0) NULL DEFAULT NULL,`scope` int(0) NULL DEFAULT 0,`del_flag` tinyint(0) NULL DEFAULT 0,`create_time` datetime(0) NULL DEFAULT NULL,`creator` tinyint(0) NULL DEFAULT NULL,`update_time` datetime(0) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of message
-- ----------------------------
INSERT INTO `message` VALUES (1, '测试消息', '消息内容', 23, 1231, 0, 0, '2022-08-17 10:39:51', 3, '2022-08-17 10:40:00');
INSERT INTO `message` VALUES (2, '测试消息', '消息内容', 23, 1231, 0, 0, '2022-08-17 10:39:51', 3, '2022-08-17 10:40:00');
INSERT INTO `message` VALUES (3, '测试消息', '消息内容', 23, 1231, 0, 0, '2022-08-17 10:39:51', 3, '2022-08-17 10:40:00');
INSERT INTO `message` VALUES (4, '测试消息', '消息内容', 23, 1231, 0, 0, '2022-08-17 10:39:51', 3, '2022-08-17 10:40:00');SET FOREIGN_KEY_CHECKS = 1;

创建表并添加四条相同的数据
接下来是我们这次的重头,我封装了一个存储过程,具体的逻辑都在注释里了,你也可以分析然后单独拿出来分批次执行sql

CREATE DEFINER=`root`@`localhost` PROCEDURE `remove`()
BEGIN
DECLARE count_all INT DEFAULT 0;
DECLARE count_copy INT DEFAULT 1;-- 创建一个临时复制表,并将目标表数据复制进来
DROP TABLE if exists message_01 ;
create TEMPORARY TABLE message_01 (SELECT * FROM message);-- 查询去重后实际条数 并赋值给我们的变量 去重根据实际需求更改GROUP BY 后面条件
SELECT COUNT(1) into count_all from (select COUNT(1) FROM message WHERE del_flag = 0 GROUP BY message_title,message_context) t ;/*删除复制表的重复数据并保留一条  保留哪条数据可以自己根据条件调节,
比如最小id等等,就是条件问题 还有就是去重根据实际需求更改GROUP BY 后面条件
这里如果使用了逻辑删除,有需要保留数据的可以改成修改逻辑删除字段
*/
DELETE FROM message_01 WHERE ID NOT IN (
select t.id FROM (select MAX(id) as id FROM message WHERE del_flag = 0 GROUP BY message_title,message_context) t
);-- 再次不去重查询 如结果和查询结果一样则操作正确且完整
select COUNT(1) INTO count_copy FROM message_01 WHERE del_flag = 0 ;-- 进行最后两次查询结果比对
IF count_all = count_copy THEN
TRUNCATE message;
INSERT INTO message (SELECT * FROM message_01);
SELECT 'success';
ELSE
SELECT '改造失败',count_all AS '原表条数',count_copy AS '复制表删除重复数据后统计的条数';
END IF;END

另外创建存储过程,就是再函数那里右键 -》过程-》输入名字-》完成 ,你也可以百度下怎么创建的,我这里就不说太多啦,如果有用,点个赞肯定一下吧,谢谢您啦。

mysql 删除表中重复数据并保留一条相关推荐

  1. MySql删除表中重复数据

    有一表中存在大量重复数据 在此记录下我删除表内重复数据的方法 -- 新增测试表 create table basic_farmer ( id INT(11), user_name VARCHAR(25 ...

  2. 查询和删除表中重复数据sql语句

    查询和删除表中重复数据sql语句 (一) 1.查询表中重复数据.select * from people where peopleId in (select   peopleId  from   pe ...

  3. MySQL删除表中的数据

    Mysql删除表中的数据有三种方法,分别是delete ,drop,truncate. 一.delete删除表中的数据 delete好from结合使用,格式一般为:delete from 表名 whe ...

  4. sql server如何删除表中重复数据

    当我们需要删除表中重复的数据的时候,该如何操作呢? 具体操作分为四个步骤: 1.将查询到的无重复数据存入临时表中 2.删除原表的内容 3.将临时表插入到原表中 4.删除临时表 理解起来是比较简单的,这 ...

  5. MySQL 删除表中的数据记录

    文章目录 前言 一.删除表中的数据记录? 1.删除特定数据记录 2.删除所有数据记录 总结 前言 删除数据记录是数据操作中常见的操作,可以删除表中已经存在的数据记录.在MySQL中可以通过DELETE ...

  6. SQL Server数据库表的基本操作(批量插入、删除、查询数据,删除表中重复数据方法)

    实验名称:数据库表的基本操作与表内数据操作 实验目的: 掌握数据库表创建方法(交互式.T-SQL法) 掌握修改数据库表结构的方法 掌握删除数据库表的方法 掌握交互式EXCEL文件录入数据至数据库表的方 ...

  7. mysql删除表中重复的行

    1首先创建一个表,来进行演示.如图先创建表 2然后切换到命令行查看数据库中的表内容,确实有重复的项. 3首先先查询出重复的行 4现在希望删除的是出现在这张表中的数据,只保留每一组中id最大的那一行,因 ...

  8. 利用SQL05特性删除表中重复数据

    问题:一个表有自增的ID列,表中有一些记录内容重复,也就是说这些记录除了ID不同之外,其他的信息都相同.需要把重复的记录保留一条,剩下的删除. 这种需求一般开发人员都会,我这里写出两个版本. 版本一: ...

  9. mysql删除表中所有数据_MySQL删除或清空表中数据的方法

    原标题:MySQL删除或清空表中数据的方法 要想把MySQL中的数据删除或清空,可以通过两种方法来实现:DELETE语句和TRUNCATE TABLE语句. DELETE语句可以将表中所有记录都删除, ...

最新文章

  1. 高频面试考点:Redis中有几百万数据量,如何进行高效访问?
  2. HALCON查找圆心C++实现
  3. 下列关于python的说法中、正确的是-以下关于 Python版本的说法中,哪个是正确的?...
  4. python外星人入侵游戏代码_Python游戏:外星人入侵游戏编程完整版!内附代码
  5. Find the most comfortable road(HDU-1598)
  6. c语言自学教材百度网盘,110G超强C语言和C++编程0基础从入门到精通自学教程 百度云盘资源...
  7. 【EXLIBRIS】随笔记 009
  8. PostgreSQL 收缩膨胀表或索引 - pg_squeeze or pg_repack
  9. SAP MM02主数据维护多语言长文本,丢失空格的解决办法
  10. CSR867X sink例程的VM工程属性编译选项简析
  11. fiddler抓手机端的包(苹果手机)
  12. Linux后台运行进程
  13. 补充Live555推实时流
  14. 统计项目工程文件总行数
  15. 2020牛客暑期多校训练营Enigmatic Partition(数学,二阶隔项差分)
  16. Lucene搜索原理
  17. 基于ZigBee的智能公交报站系统
  18. iOS系统最好的拨号app_我是亲民_新浪博客
  19. Linux之crontab(例行性任务)
  20. Python:扑克牌游戏

热门文章

  1. 中标linux iso,中标普华有没有ISO文件下载啊
  2. 微信小程序多维数组筛选(以二维数组为例)
  3. 何时使用PostMapping和GetMapping
  4. web缓存(强制缓存、协商缓存、CDN缓存)
  5. css 全屏显示一张图片_css3背景图片全屏显示的例子
  6. CSS3实现GIF动画
  7. python点餐系统早餐_python3实现点餐系统
  8. 一些常用的yum安装卸载的命令
  9. mac使用Fiddler实现ios抓包
  10. 怎样避免水果店恶性竞争,水果店遇到恶性竞争怎么办