创建表:

  CREATE TABLE `info` (
  `id` tinyint NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8

插入数据:INSERT INTO info(`name`) VALUE('张三'),('李四'),('麻婆'),('王五');

再插入一次:INSERT INTO info(`name`) VALUE('张三'),('李四'),('麻婆'),('王五');

再插入一次:INSERT INTO info(`name`) VALUE('张三'),('李四'),('麻婆'),('王五');

看见好多重复数据了吧,干掉它!

delete from info where info.id in 
(select tmp.id from
(select max(id) id from info group by `name` having count(`name`)>1 ) tmp
)
但这个办法,一次只能干掉重复数据的最大id,没关系,用循环嘛。
多来几次,世界清爽了:

  id name
  1 张三
  2 李四
  3 麻婆
  4 王五

再插入一次:INSERT INTO info(`name`) VALUE('麻老五');

  id name
  1 张三
  2 李四
  3 麻婆
  4 王五
  13 麻老五

但且慢,麻老五的id值变成了13,应该是5才对啊。看看创建表的过程,原来是设置了自增字段,delete 清除了数据,但没有清除自增字段值。

解决它:

先删除掉刚刚插人的这行,

查查现在有多少行:

select count(id) from info

重置自增字段偏移值为行数:
alter table info AUTO_INCREMENT = 4

现在再插入:INSERT INTO info(`name`) VALUE('麻老五');

  id name
  1 张三
  2 李四
  3 麻婆
  4 王五
  5 麻老五

用pymysql实现上述过程,完整代码如下: 

import pymysql

conn = pymysql.connect(host='xx.xxx.xxx.x', port=3306, user='root', passwd='root123', charset="utf8", db='luffydb')
cursor = conn.cursor()

# 功能:循环删除重复数据,并修改自增字段偏移值为count(id)。

sql = 'select max(id) from info group by `name` having count(`name`)>1'
cursor.execute(sql)
ret = cursor.fetchall() # 查询重复数据,但只取到重复数据的最大id,所以要用while循环,直到这个值为空。
while ret:
# 先删除查出的id
cursor.execute(delete from info where info.id in
(select tmp.id from
(select max(id) id from info group by `name` having count(`name`)>1 ) tmp
)
           )
conn.commit()

# 执行删除后再查询,重新获得ret值,供while判断。
cursor.execute(sql)
ret = cursor.fetchall()

# 重置自增字段偏移值
cursor.execute('select count(id) from info')
ret = cursor.fetchone() # 查到现在的行数
sql = 'alter table info AUTO_INCREMENT = %s'
cursor.execute(sql, [ret[0]]) # 重置自增字段偏移值为行数。

注意:mysql不支持,在一条语句对同一个表,先查询再更新的操作。所以要在'tmp'表外面再套一个表。否则报1093错误。



 

使用pymysql循环删除重复数据,并修改自增字段偏移值的更多相关文章

  1. mysql 约束条件 auto_increment 自动增长 修改自增字段起始值

    创建一张表 t20 mysql) ); Query OK, rows affected (0.01 sec) mysql> desc t20; +-------+----------+----- ...

  2. mysql删除重复数据(通过多个字段分组,删除某一字段为空的数据)

    DELETE FROM t_questions WHERE Id in ( SELECT Id FROM ( SELECT Id FROM `t_questions` WHERE (Name,Ques ...

  3. mongodb删除重复数据

    注:mongodb当前版本是3.4.3   插入六条数据:   查询存在重复的数据:   查询并循环删除重复数据:   删除语句解析: db.userInfo.aggregate([     {   ...

  4. T-SQL技术收集——删除重复数据

    原文:T-SQL技术收集--删除重复数据 在工作和面试中,经常出现如何查询或者删除重复数据的问题,如果有主键,那还好办一点,如果没有主键,那就有点麻烦. 当一个表上没有辅助键时,如果使用SSMS界面来 ...

  5. 【MySQL】测试MySQL表中安全删除重复数据只保留一条的相关方法

    第二篇文章测试说明 开发测试中,难免会存在一些重复行数据,因此常常会造成一些测试异常. 下面简单测试mysql表删除重复数据行的相关操作. 主要通过一下三个大标题来测试说明: 02.尝试删除dept_ ...

  6. MYSQL删除重复数据

     delete from co_jobinformation cwhere c.name in (select cc.name from co_jobinformation cc group by   ...

  7. sql查询删除重复数据

    数据库UserInfo 删除重复数据 即删除重复的用户名手机号 同一个用户名手机号只保留一个用户 01.根据多个字段查询重复数据 with data1 as( select MobilePhone,N ...

  8. 取两个DataTable的交集,删除重复数据

    /// <summary> /// 取两个DataTable的交集,删除重复数据 /// </summary> /// <param name="sourceD ...

  9. MSSQL如何在没有主键的表中删除重复数据

    为了对重复数据进行实验,下面建一个设计不太好(没有主键)表并插入了一些重复数据: create database testdb use testdb ; go create table DupsNoP ...

随机推荐

  1. Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读

    Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读 Action4D: Online Action Recognition in the Crowd and Clutter 论文链接 ...

  2. python做。大神空闲时间能帮忙弄一串代码嘛?猜拳游戏,分很多种手的背面和正面,最后剩下的再石头剪刀布

    .每天课程结束后,老师会选择一列的同学清扫教室,人数不定(建议根据当时情况输入),在收拾完教室后,最后一步是需要从这一列的同学中选择1-2人去倒垃圾桶,垃圾桶数量根据当时情况决定,目前采取的方式是, ...

  3. C#开发之基于NPOI的操作Excel开发体验

    最近遇到一个数据导入的需求,语言是.net framework 4.7的C#.但是,这次主要探讨NPOI的体验,原则就是向前兼容.所以采用.xls的支持.网上的资料,我稍微整合了一些. #1 单元格下 ...

  4. 【NX二次开发】开发好几年,还只会用ufusr?其他用户出口函数介绍

    用户出口(User Exit)是NX Open 中的一个重要概念.NX在运行过程中某些特定的位置存在规定的出口,当进程执行到这些出口时,NX会自动检查用户是否在此处已定义了指向内部程序位置的环境变量: ...

  5. 31.qt quick-使用SwipeView添加滑动视图-高仿微信V2版本

    在上章我们学习了ListView,然后实现了: 28.qt quick-ListView高仿微信好友列表和聊天列表,本章我们来学习SwipeView滑动视图,并出高仿微信V2版本: 1.Contain ...

  6. Integer 如何实现节约内存和提升性能的?

    在Java5中,为Integer的操作引入了一个新的特性,用来节省内存和提高性能.整型对象在内部实现中通过使用相同的对象引用实现了缓存和重用. 上面的规则默认适用于整数区间 -128 到 +127(这 ...

  7. alert日志报错:ERROR: failed to establish dependency between database RACDB and diskgroup resource ora.DATA.dg

    一.打开数据库alert日志,发现有报错 ERROR: failed to establish dependency between database RACDB and diskgroup reso ...

  8. Flannel和Calico网络插件对比

    1.Kubernetes通信问题 1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现. 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另 ...

  9. 关于开箱即用的文档静态网站生成器VuePress

    关于VuePress 一个由Vue驱动的静态文档网站生成框架,具有开箱即用的优点. 给项目添加.gitignore .gitignore是git用来排除目录的清单,我们把以下目录加入其中,以便每次操作 ...

  10. 12、关于系统cpu的计算

    1.cpu核数和逻辑cpu: CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数: 总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数 2.查看linux的cpu相关信 ...