zoukankan      html  css  js  c++  java
  • mysql去重

    原因:由于表是各地归集过来的,通过前置机数据交换,很多数据会重复。
    目的:删除数据库某张表的重复数据

    方法一(将查询出无重复的数据导入临时表,再将原表删除,再将临时表的数据导回原表) 适用于无主键,所有字段完全匹配,数据量小的情况:

    DELIMITER //
    CREATE PROCEDURE delete_rows(IN tablename VARCHAR(50))
    BEGIN
    SET @tablename = tablename;
    SET @tmp_table = CONCAT('tmp_table_',@tablename);
    
    SET @create_table = CONCAT('DROP TABLE IF EXISTS ',@tmp_table);
    PREPARE create_table FROM @create_table;
    EXECUTE create_table;
    
    SET @create_table = CONCAT('CREATE TEMPORARY TABLE ',@tmp_table,' SELECT DISTINCT * from ',@tablename);
    PREPARE create_table FROM @create_table;
    EXECUTE create_table;
    
    SET @create_table = CONCAT('TRUNCATE TABLE ',@tablename);
    PREPARE create_table FROM @create_table;
    EXECUTE create_table;
    
    SET @create_table = CONCAT('INSERT INTO ',@tablename,' SELECT * from ',@tmp_table);
    PREPARE create_table FROM @create_table;
    EXECUTE create_table;
    END//
    DELIMITER ;
    
    CALL delete_rows('表名');
    

    方法二(给表加自增主键) 适用于根据某几个字段去重,有主键:

    DELIMITER //
    CREATE PROCEDURE delete_rows_1(IN tablename VARCHAR(50),IN fieldnames VARCHAR(100),IN autofield VARCHAR(50))
    BEGIN
    SET @tablename = tablename;
    SET @fieldnames = fieldnames;
    SET @autofield = autofield;
    
    SET @create_table = CONCAT('DELETE FROM ', @tablename ,' WHERE ', @autofield ,' not in (SELECT id FROM (SELECT max(', @autofield ,') id FROM ', @tablename ,' GROUP BY ', @fieldnames ,') t)');
    PREPARE create_table FROM @create_table;
    EXECUTE create_table;
    END//
    DELIMITER ;
    
    CALL delete_rows_1('表名', '字段1,字段2,字段3...', '主键字段');
    
  • 相关阅读:
    Linxu 挂载光盘和硬盘
    Linux firewall
    指纹获取 Fingerprint2
    Vue 封装的组件生命周期钩子
    vue富文本编辑,编辑自动预览,单个图片上传不能预览的问题解决:
    vue 集成百度富文本编辑器
    axios 的二次封装
    element 列表中已选的标记
    element 表单的input循环生成,并可单个input失去焦点单个验证并保存; (多个表单实例)
    axios 二进制流导出
  • 原文地址:https://www.cnblogs.com/jarjune/p/8328013.html
Copyright © 2011-2022 走看看