创建表:

  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. 用NumPy genfromtxt导入数据

    用NumPy genfromtxt导入数据 NumPy provides several functions to create arrays from tabular data. We focus ...

  2. CVPR2020论文解析:视觉算法加速

    CVPR2020论文解析:视觉算法加速 GPU-Accelerated Mobile Multi-view Style Transfer 论文链接:https://arxiv.org/pdf/2003 ...

  3. Structured Streaming编程 Programming Guide

    Structured Streaming编程 Programming Guide Overview Quick Example Programming Model Basic Concepts Han ...

  4. MySQL笔记01(黑马)

    一.数据库基本介绍 目标:了解数据库的功能和常见数据库分类.数据库产品 数据库基本知识 数据库分类 SQL简介 MySQL访问 1.数据库基本知识 目标:了解数据库的概念和数据库的作用 概念 数据库: ...

  5. 八、Nginx的TCP/UDP调度器

    nginx 1.9后才可以调用其他应用 1.9前只能调用web 部署nginx服务器----配置----起服务.验证 部署nginx服务器: [root@proxy ~]# yum –y instal ...

  6. vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)

    文章很长,建议收藏起来,慢慢读! 备注:持续更新中..... 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 + 涨薪必备 疯 ...

  7. Python3中列表、字典、元组、集合的看法

    文首,我先强调一下我是一个弱鸡码农,这个随笔是在我学习完Python3中的元组.字典.列表,集合这四种常见数据的数据类型的一些感想,如果有什么不对的地方欢迎大家予以指正.谢谢大家啦 回归正题:这篇随笔 ...

  8. 一次SQL查询优化原理分析(900W+数据,从17s到300ms)

    有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: ...

  9. RobotFramework + Python 自动化入门 三 (Web自动化)

    在<RobotFramwork + Python 自动化入门 一>中,完成了一个Robot环境搭建及测试脚本的创建和执行. 在<RobotFramwork + Python 自动化入 ...

  10. ANDROID开发 Fatal signal 11(SIGSEGV) at 0x问题解决方案

    最近做ANDROID开发,也遇到了很多程序员遇到的一个问题:FATAL SIGNAL 11(SIGSEGV) at 0xxxxx,自然是各种搜索是否有人已然解决,虽然搜索出来的已有案例不少,基本都是内 ...