这张表有20w行数据,其中第8w条 - 15w条是多余的,也不能重新导,因为可能其他公司的同事已经在处理了,这时该怎么删除多余数据呢?
为了不被领导邀请爬山,他找到我求救。
小刘:“哈哥,救命救命,这MySQL没有自增主键,我咋删除第[8w,15w]的数据啊?”
陈哈哈:“啊?MySQL又没有rowNum,那咋搞啊?我不会,不会~”
小刘:“一顿串儿!哈哥快来”
陈哈哈:“哎呀,我这活儿急得一匹,下午再说吧。”
小刘:“今儿晚上,望京小腰,不请我是你儿子!”
陈哈哈:“什么串儿串儿的,都是兄弟,说的就跟我怕你吹牛B不请似的,来吧来吧,一起看看咋处理。”
小刘:“……”
其实,在MySQL中确实没有rownum伪列,但我们可以自己写函数定义。线上数据不方便,下面我拿一些测试数据来举例吧(15条),如下
mysql> select * from t_student;
+------------+-----+-----+-------+----------+-----------+
| NAME | SEX | AGE | CLASS | GRADE | HOBBY |
+------------+-----+-----+-------+----------+-----------+
| 陈哈哈 | 男 | 15 | 18班 | 9年级1 | 上网 |
| 扈亚鹏 | 男 | 15 | 18班 | 9年级1 | 美食 |
| 徐立楠 | 女 | 14 | 18班 | 9年级1 | 阅读 |
| 陈子凝 | 女 | 15 | 18班 | 9年级1 | 看电影 |
| 刘晓莉 | 女 | 14 | 18班 | 9年级1 | 金希澈 |
| 陈哈哈1 | 男 | 15 | 18班 | 9年级2 | 上网 |
| 扈亚鹏1 | 男 | 15 | 18班 | 9年级2 | 美食 |
| 徐立楠1 | 女 | 14 | 18班 | 9年级2 | 阅读 |
| 陈子凝1 | 女 | 15 | 18班 | 9年级2 | 看电影 |
| 刘晓莉1 | 女 | 14 | 18班 | 9年级1 | 金希澈 |
| 陈哈哈2 | 男 | 15 | 18班 | 9年级2 | 上网 |
| 扈亚鹏2 | 男 | 15 | 18班 | 9年级2 | 美食 |
| 徐立楠2 | 女 | 14 | 18班 | 9年级2 | 阅读 |
| 陈子凝2 | 女 | 15 | 18班 | 9年级2 | 看电影 |
| 刘晓莉2 | 女 | 14 | 18班 | 9年级1 | 金希澈 |
+------------+-----+-----+-------+----------+-----------+
15 rows in set (0.00 sec)
如何查询这些的数据的行值呢?SQL如下:
-- 在没自增主键情况下,查询数据行(rownum),行号
select @rownum:=@rownum+1 AS rownum,`NAME`,`SEX`,`CLASS`,`GRADE`
from t_student ,(SELECT @rownum:=0) r;
查询结果如下:
mysql> select @rownum:=@rownum+1 AS rownum,`NAME`,`SEX`,`CLASS`,`GRADE` from t_student ,(SELECT @rownum:=0) r;
+--------+------------+-----+-------+----------+
| rownum | NAME | SEX | CLASS | GRADE |
+--------+------------+-----+-------+----------+
| 1 | 陈哈哈 | 男 | 18班 | 9年级1 |
| 2 | 扈亚鹏 | 男 | 18班 | 9年级1 |
| 3 | 徐立楠 | 女 | 18班 | 9年级1 |
| 4 | 陈子凝 | 女 | 18班 | 9年级1 |
| 5 | 刘晓莉 | 女 | 18班 | 9年级1 |
| 6 | 陈哈哈1 | 男 | 18班 | 9年级2 |
| 7 | 扈亚鹏1 | 男 | 18班 | 9年级2 |
| 8 | 徐立楠1 | 女 | 18班 | 9年级2 |
| 9 | 陈子凝1 | 女 | 18班 | 9年级2 |
| 10 | 刘晓莉1 | 女 | 18班 | 9年级1 |
| 11 | 陈哈哈2 | 男 | 18班 | 9年级2 |
| 12 | 扈亚鹏2 | 男 | 18班 | 9年级2 |
| 13 | 徐立楠2 | 女 | 18班 | 9年级2 |
| 14 | 陈子凝2 | 女 | 18班 | 9年级2 |
| 15 | 刘晓莉2 | 女 | 18班 | 9年级1 |
+--------+------------+-----+-------+----------+
15 rows in set (0.00 sec)
可以看到查询到的行号,那我该怎么通过上面查到的rownum行来进行删除呢?其实这个想法是行不通的,因为上面的rownum就是一个展示值,是没有其他实际效果的。
但是,我可以通过找到表中的唯一列(如UUID、MD5、包名、身份证ID),通过范围条件查询rownum,从而找到需要删除的唯一键集合,比如在这张表中存在唯一键是“NAME”,那么我通过查到第[6,10]行数据的唯一键“NAME”,从而通过子查询来删除,(这里是把人名后有“1”的删除)。SQL如下:
我们先看一下第[6,10]行数据,SQL如下:
-- 查询第6到第10行数据。
SELECT * from (select @rownum:=@rownum+1 AS rownum,`NAME`,`SEX`,`CLASS`,`GRADE` from
t_student ,(SELECT @rownum:=0) r) t where t.rownum between 6 and 10;
返回结果:
mysql> SELECT * from (select @rownum:=@rownum+1 AS rownum,`NAME`,`SEX`,`CLASS`,`GRADE` from t_student ,(SELECT @rownum:=0) r) t
-> where t.rownum between 6 and 10;
+--------+------------+-----+-------+----------+
| rownum | NAME | SEX | CLASS | GRADE |
+--------+------------+-----+-------+----------+
| 6 | 陈哈哈1 | 男 | 18班 | 9年级2 |
| 7 | 扈亚鹏1 | 男 | 18班 | 9年级2 |
| 8 | 徐立楠1 | 女 | 18班 | 9年级2 |
| 9 | 陈子凝1 | 女 | 18班 | 9年级2 |
| 10 | 刘晓莉1 | 女 | 18班 | 9年级1 |
### 最后
**如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!**
**[资料免费领取方式:点击这里](https://gitee.com/vip204888/java-p7)**

18班 | 9年级2 |
| 10 | 刘晓莉1 | 女 | 18班 | 9年级1 |
### 最后
**如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!**
**[资料免费领取方式:点击这里](https://gitee.com/vip204888/java-p7)**
[外链图片转存中...(img-oXvsYegx-1628416360127)]
