mysql清除表重复数据

表信息

CREATE TABLE `rmb_item_material` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `store_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '商店id',
  `item_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '商品id',
  `sequence` int(11) NOT NULL DEFAULT '0' COMMENT '排序序号',
  `pin_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '置顶标识',
  `pin_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '置顶时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_item_material_sid_iid` (`store_id`,`item_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1048 DEFAULT CHARSET=utf8mb4 COMMENT='商品物料表';

 因为索引idx_item_material_sid_iid并不是唯一索引,导致上次执行数据迁移sql时使生产库出现了部分脏数据;现要清理重复数据。

先查看有哪些数据重复

select store_id, item_id,GROUP_CONCAT(id) from rmb_item_material GROUP BY store_id, item_id HAVING count(1) > 1

如图,store_id和item_id都相等的数据id有这些,现要保留每组最小id的数据,其余重复数据删除

SELECT
    a.id
FROM
    rmb_item_material a
INNER JOIN 
    ( SELECT store_id, item_id FROM rmb_item_material GROUP BY store_id, item_id HAVING count( 1 ) > 1 ) b 
ON 
    ( a.store_id = b.store_id AND a.item_id = b.item_id )
WHERE
    id NOT IN ( SELECT MIN( id ) AS id FROM rmb_item_material GROUP BY store_id, item_id HAVING count( 1 ) > 1 )

DELETE
FROM
	rmb_item_material
WHERE
	id IN (
	SELECT temp.id FROM
	(
		SELECT
			a.id
		FROM
			rmb_item_material a
			INNER JOIN ( SELECT store_id, item_id FROM rmb_item_material GROUP BY store_id, item_id HAVING count( 1 ) > 1 ) b ON ( a.store_id = b.store_id AND a.item_id = b.item_id )
		WHERE
			id NOT IN ( SELECT MIN( id ) AS id FROM rmb_item_material GROUP BY store_id, item_id HAVING count( 1 ) > 1 )
	) temp
	);

再drop掉原来的索引,重新创建成唯一索引

ALTER TABLE rmb_item_material DROP INDEX `idx_item_material_sid_iid`;

ALTER TABLE `rmb_item_material` ADD UNIQUE `udx_item_material_sid_iid` ( `store_id`, `item_id` );

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值