无自增字段mysql去重_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...', '主键字段');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值