精华内容
下载资源
问答
  • mysql删除表中重复数据
    千次阅读
    2022-08-17 10:43:23

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

    /*
     Navicat Premium Data Transfer
    
     Source Server         : localmysql
     Source Server Type    : MySQL
     Source Server Version : 80030
     Source Host           : localhost:3306
     Source Schema         : nie_db
    
     Target Server Type    : MySQL
     Target Server Version : 80030
     File Encoding         : 65001
    
     Date: 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
    

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

    更多相关内容
  • 执行这个语句后,我们可以看到现在的结果里显示的就是表中重复数据的字段。 要删除这些重复的数据,我们找出这些数据的ID,在select语句里,添加id字段,使用max函数,可以得到重复数据最后面的id。 执行结果如图...
  • Mysql删除表中重复数据

    千次阅读 2021-01-11 16:14:27
    一张中有重复数据,需要删除重复的数据,只保留(最大/最小)一条。 例: 现有A: id:主键(唯一) b:数据(有重复) 需求: 删除表中重复的数据,保留相同数据中id最小的数据。 效果: sql 思路:先查询...

    --------文章内容为个人理解,欢迎交流--------


    一张表中有重复数据,需要删除重复的数据,只保留(最大/最小)一条。

    例:

    现有A表:
    id:主键(唯一)
    b:数据(有重复)
    在这里插入图片描述

    需求:

    删除表中重复的数据,保留相同数据中id最小的数据。

    效果:

    在这里插入图片描述

    sql

    思路:先查询出去重过后的id(可用分组),再删除其它id的数据

    DELETE FROM A WHERE	id NOT IN ( SELECT id FROM ( SELECT	min(id) AS id FROM A GROUP BY b ) C );
    
    sql解释
    DELETE
    FROM
    	A	# 表A
    WHERE
    	id NOT IN ( # 需要删除数据的id,不包含下面查询出来的id
    		SELECT	# 此条SELECT查询不可省,否则报错:You can't specify target table 'A' for update in FROM clause。
    				# 内层SELECT分组后,再次查询C表获得id
    			id
    		FROM
    			(
    				SELECT
    					min(id) AS id	# 保留相同数据中,id最小的数据。AS不可省,命名别名为id。
    									# 若省略,运行2个SELECT报错:Unknown column 'id' in 'field list'。
    									# 整体语句执行不会报错,但无效果。
    				FROM
    					A
    				GROUP BY
    					b
    			) C	  # 此处的C,不可省。分组后的数据,生成表C,外层SELECT查询C表,获取最终的id
    	);
    
    展开全文
  • 示例表中数据如下: 根据uniqle_id这一列来判断数据是否重复 1.查看重复数据有哪些 select uniqle_id,name from person group by uniqle_id having count(uniqle_id) > 1 结果如下: 2.删除重复的列,只保留...

    示例表中数据如下:
    在这里插入图片描述
    根据uniqle_id这一列来判断数据是否重复
    1.查看重复的数据有哪些

    select uniqle_id,name from person group by uniqle_id having count(uniqle_id) > 1
    

    结果如下:
    在这里插入图片描述
    2.删除重复的列,只保留id最小的一行

    delete from person where uniqle_id in (
    select * from
    (select min(uniqle_id) from person group by uniqle_id having count(uniqle_id) > 1) temp
    )
    and id not in 
    (select * from 
    (select min(id) from person group by uniqle_id having count(uniqle_id)> 1 )temp2
    )
    
    

    3.删除所有重复的行

    delete from person where uniqle_id in (
    select * from
    (select min(uniqle_id)as uniqle_id from person group by uniqle_id having count(uniqle_id) > 1) temp
    )
    

    (sql中的temp存在的作用是给子查询的结果起一个别称,如果不起这个别称的话,会报错:SQL 错误 [1248] [42000]: Every derived table must have its own alias)

    展开全文
  • MySQL删除表重复数据

    千次阅读 2022-04-29 01:39:58
    MySQL删除重复数据 如下 单子段重复 删除删除仅stu_name一个字段重复的数据 -- 查询全部重复数据 select * from tb_4 where stu_name in (select stu_name from tb_4 group by stu_name having count(1) > ...

    MySQL删除重复数据

    • 如下表
      在这里插入图片描述单子段重复

      • 删除删除仅stu_name一个字段重复的数据
      -- 查询全部重复数据
      select * from tb_4 where stu_name in (select stu_name from tb_4 group by stu_name having count(1) > 1)
      -- 删除全部重复数据
      delete from tb_4 where stu_name in (select a.stu_name from (select stu_name from tb_4 group by stu_name having count(1) > 1)a)
      
      
       	![在这里插入图片描述](https://img-blog.csdnimg.cn/c2bf098b61194e77acd54fe53a9f8ddc.png#pic_center)
      
      • 部分删除(保留一行)
      -- 查询多余重复数据
      select * from tb_4 where id not in (select min(id) from tb_4 group by stu_name)
      -- 删除多余重复数据(保留一行)
      delete from tb_4 where id not in (select a.min_id from (select min(id) as min_id from tb_4 group by stu_name)a)
      
       		![在这里插入图片描述](https://img-blog.csdnimg.cn/bb698d67c0674e809f70d30f02b19c2a.png#pic_center)
      

    多字段重复:

    • 全部删除 (删除stu_name、score两个字段重复的数据)

      -- 查询全部重复数据
      select * from tb_4 where  stu_name in (select a.stu_name from (select stu_name from tb_4 group by stu_name, score having count(1) > 1)a)
      and score in (select a.score from (select score from tb_4 group by stu_name, score having count(1) > 1)a)
      -- 删除全部重复数据
      delete from tb_4 where stu_name in (select a.stu_name from (select stu_name from tb_4 group by stu_name, score having count(1) > 1)a)
      and score in (select a.score from (select score from tb_4 group by stu_name, score having count(1) > 1)a)
      
       ![在这里插入图片描述](https://img-blog.csdnimg.cn/c926658eb9bc47c0b4760d081aaa2005.png#pic_center)
      
    • 部分删除(保留一行)

      -- 查询多余重复数据
      select * from tb_4 where id not in (select min(id) from tb_4 group by stu_name, score)
      -- 删除多余重复数据(保留一行)
      delete from tb_4 where id not in (select a.min_id from (select min(id) as min_id from tb_4 group by stu_name, score)a)
      
       		![在这里插入图片描述](https://img-blog.csdnimg.cn/f10f2284d0c449a19f667c54def40afe.png#pic_center)
      
    展开全文
  • mysql删除表重复数据

    千次阅读 2022-01-13 17:15:23
    mysql数据库可能会出现没有唯一约束导致的数据会有多条的问题,那么我们怎么删除多余的数据只保留其中一条数据。这里有一些方法可以快速进行删除多余的数据 新建示例结构和数据 CREATE TABLE `user` ( ...
  • Mysql删除表中重复数据,已解决

    万次阅读 2018-12-21 08:54:13
    如何快速删除数据表中重复【某个字段重复】的数据呢,比如我customer表中有一个cus_nmae字段,如果要删除cus_name字段的重复记录,且保留最小主键【这里customer的主键是cid】,首先想到的sql应该如下: DELETE ...
  • MYSQL 删除表中重复数据

    万次阅读 2018-08-23 15:30:43
    test表中name字段信息有重复,想进行过滤删除重复数据 删除重复数据之后的预期结果(不考虑id):   方法一: 用 create ......select......group by ...... 先创建临时tab,新tab的数据时从test表中分组...
  • 业务遇到要从表里删除重复数据的需求,使用了下面的方法,执行成功,大家可以参考使用
  • 异常意为:你不能指定目标的更新在FROM子句。傻了,MySQL 这样写,不行,让人郁闷。 难倒只能分步操作,蛋疼 以下是网友写的,同样是坑爹的代码,我机器上运行不了。 1. 查询需要删除的记录,会保留一条记录。 ...
  • 最近在做一个批量数据导入到MySQL数据库的功能,从批量导入就可以知道,这样的数据在插入数据库之前是不会进行重复判断的,因此只有在全部数据导入进去以后在执行一条语句进行删除,保证数据唯一性。 下面话不多说了...
  • 采用的是下面的方法可删除,假设重复的是test数据库的title字段 代码如下:create table bak as (select * from test group by title having count(*)=1); insert into bak (select * from test...
  • mysql查询表里的重复数据方法

    千次阅读 2021-01-20 00:06:15
    这篇文章主要介绍了mysql查询表里的重复数据方法,需要的朋友可以参考下INSERT INTO hk_test(username, passwd) VALUES('qmf1', 'qmf1'),('qmf2', 'qmf11')delete from hk_test where username='qmf1' and passwd='...
  • 结构: mysql> desc demo; +——-+——————+——+—–+———+—————-+ | Field | Type | Null | Key | Default | Extra | +——-+——————+——+—–+———+—————-+ | id | int(11) unsigned |...
  • mysql 删除表中重复数据 DELETE FROM table_name WHERE id not in(SELECT min(id) ids FROM table_name WHERE enable=1 GROUP BY bank_id) mysql中delete、update 操作,不能在同一表中查询的数据作为同一的更新...
  •  通常情况下,一个我们在做一个产品的时候,一开始可能由于设计考虑不周或者程序写的不够严谨,某个字段上的值产生重复了,但是又必须去掉,这个时候就稍微麻烦了一点,直接加一个 UNIQUE KEY 肯定是不行了,因为...
  • 在网上查找删除重复数据保留id最小的数据,方法如下: DELETE FROM people WHERE peopleName IN ( SELECT peopleName FROM people GROUP BY peopleName HAVING count(peopleName) > 1 ) AND peopleId ...
  • 有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。 本章节我们将为大家介绍如何防止数据出现重复数据及如何删除数据表中重复数据。 防止表中...
  • 本文实例讲述了删除MySQL重复数据的方法。分享给大家供大家参考。具体方法如下: 项目背景 在最近做的一个linux性能采集项目,发现线程的程序入库很慢,再仔细定位,发现数据库里面很多冗余数据。因为在采集,...
  • 有这样一张表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 50 1240 Abraham Lincoln High School 70 35 1241 Acalanes High School 120 89...
  • 以为通过命令直接删除就可以了,总是报错: delete from test ...where name in(select name from test as t ...1. 首先先创建一个临时,然后将author表中重复数据拎出来,放进临时表中。 create temporar
  • 有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。 本章节我们将为大家介绍如何防止数据出现重复数据及如何删除数据表中重复数据。 一、防止...
  • MySQL删除重复数据

    2022-07-11 16:50:45
    mysql删除重复数据只保留一条。
  • mysql去除重复数据 根据one列查询重复的数据(根据单列判断重复) SELECT * FROM tab_test WHERE ONE IN (SELECT ONE FROM testdelete GROUP BY ONE HAVING COUNT(ONE) > 1) ; 删除表中的重复记录:(根据单列...
  • 主要介绍了MySQL中删除重复数据的简单方法,比起一般的NOT IN语句的效率更为高,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 226,365
精华内容 90,546
关键字:

mysql删除表中重复数据

mysql 订阅