mysql 单表去重_MySQL单表去重案例

问题描述:线上数据库表字段需要添加一个唯一约束(之前该字段有索引)。添加的时候报错(下文操作均为测试环境问题复现)

root@localhost:mysql.sock 17:42:18 [practice]>drop index idx_name on test;

Query OK, 0 rows affected (0.02 sec)

Records: 0 Duplicates: 0 Warnings: 0

root@localhost:mysql.sock 17:44:30 [practice]>alter table test add unique idx_name(name);

ERROR 1062 (23000): Duplicate entry 'eeee' for key 'idx_name'

root@localhost:mysql.sock 17:47:55 [practice]>delete from test where id in (SELECT t1.id from test as t1,test as t2 where t1.name = t2.name and t1.id !=t2.id);

ERROR 1093 (HY000): You can't specify target table 'test' for update in FROM clause

root@localhost:mysql.sock 18:04:14 [practice]>delete from test where id in (SELECT t1.id from (select * from test as tmp) as t1,(select * from test as tmp) as t2 where t1.name = t2.name and t1.id !=t2.id);

Query OK, 5 rows affected (0.01 sec)

纳尼?查下官方文档吧,看来是不支持这样搞(我的版本是5.7.14)

2656e3f2a6ef1bff54d7fe5fc9ae60c8.png

解决办法:

方案一:这个命令在MySQL5.1.37之前是可以的,在5.1.48以后就行不通了,它会删除重复数据,建立唯一索引。另外这个方式在percona server中也是行不通的(用不了)

alter ignore table test addunique idx_name (name);

方案二:重建表

创建一个中间表,对数据去重插入中间表,再drop原表,rename中间表

root@localhost:mysql.sock 18:37:56 [practice]>insert into uniq_test select * from test group by name;

Query OK, 6 rows affected (0.01 sec)

Records: 6 Duplicates: 0 Warnings: 0

root@localhost:mysql.sock 18:42:26 [practice]>drop table test;

root@localhost:mysql.sock 18:42:51 [practice]>rename table uniq_test to test;

方案三:利用中间表(推荐)

| tmp_ids | CREATE TABLE `tmp_ids` (

`id` int(11) DEFAULT NULL,

`name` char(20) DEFAULT NULL

) ENGINE=innodb DEFAULT CHARSET=utf8 |

root@localhost:mysql.sock 19:36:02 [practice]>insert into tmp_ids select max(id),name from test group by name having count(*)>1 orderr by null;

Query OK, 1 row affected (0.01 sec)

Records: 1 Duplicates: 0 Warnings: 0

root@localhost:mysql.sock 19:38:07 [practice]>delete a.* from test a,tmp_ids b where b.name=a.name and a.id

Query OK, 2 rows affected (0.04 sec)

为了方便大家交流,本人开通了微信公众号,和QQ群291519319。喜欢技术的一起来交流吧

8ee405e99bbacaa385ff4ef0a5942c3d.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于 MySQL 的数据分析案例,它涉及到一个电商网站的订单数据。我们将通过分析这些数据,得出以下几个问题的答案: 1. 该电商网站的销售额是多少? 2. 哪些商品是最畅销的? 3. 哪些用户是该网站的忠实用户? 下面是案例中使用的 MySQL 代码以及代码的详细解释: 1. 该电商网站的销售额是多少? ```sql SELECT SUM(total_price) AS sales FROM orders; ``` 这段 SQL 语句使用了聚合函数 `SUM()`,用于计算订单表 `orders` 中所有订单的销售额总和。`AS` 关键字用于给查询结果的列设置别名,便于后续引用。这里将总销售额设置为 `sales`。 2. 哪些商品是最畅销的? ```sql SELECT product_name, SUM(quantity) AS total_sales FROM order_items GROUP BY product_name ORDER BY total_sales DESC LIMIT 10; ``` 这段 SQL 语句使用了聚合函数 `SUM()` 和分组函数 `GROUP BY`,用于计算每种商品在所有订单中的销售数量总和,并按照销售数量从高到低排序。`ORDER BY` 关键字用于对查询结果进行排序,`DESC` 示降序排列。`LIMIT` 关键字用于限制查询结果的数量,这里只展示销售数量排名前十的商品。 3. 哪些用户是该网站的忠实用户? ```sql SELECT user_id, COUNT(DISTINCT order_id) AS order_count FROM orders GROUP BY user_id HAVING order_count >= 5; ``` 这段 SQL 语句使用了聚合函数 `COUNT()` 和分组函数 `GROUP BY`,用于计算每个用户的订单数量,并筛选出订单数量大于等于 5 的用户。`HAVING` 关键字用于对分组后的结果进行筛选,只显示符合条件的查询结果。`DISTINCT` 关键字用于去重,保证计算结果的准确性。 以上就是一个基于 MySQL 的数据分析案例及其代码解释。通过使用 SQL 语句,我们可以对关系型数据库中的数据进行聚合、分组、排序、筛选等操作,从而得出有价值的数据分析结论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值