使用pymysql循环删除重复数据,并修改自增字段偏移值
创建表:
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循环删除重复数据,并修改自增字段偏移值的更多相关文章
- mysql 约束条件 auto_increment 自动增长 修改自增字段起始值
创建一张表 t20 mysql) ); Query OK, rows affected (0.01 sec) mysql> desc t20; +-------+----------+----- ...
- mysql删除重复数据(通过多个字段分组,删除某一字段为空的数据)
DELETE FROM t_questions WHERE Id in ( SELECT Id FROM ( SELECT Id FROM `t_questions` WHERE (Name,Ques ...
- mongodb删除重复数据
注:mongodb当前版本是3.4.3 插入六条数据: 查询存在重复的数据: 查询并循环删除重复数据: 删除语句解析: db.userInfo.aggregate([ { ...
- T-SQL技术收集——删除重复数据
原文:T-SQL技术收集--删除重复数据 在工作和面试中,经常出现如何查询或者删除重复数据的问题,如果有主键,那还好办一点,如果没有主键,那就有点麻烦. 当一个表上没有辅助键时,如果使用SSMS界面来 ...
- 【MySQL】测试MySQL表中安全删除重复数据只保留一条的相关方法
第二篇文章测试说明 开发测试中,难免会存在一些重复行数据,因此常常会造成一些测试异常. 下面简单测试mysql表删除重复数据行的相关操作. 主要通过一下三个大标题来测试说明: 02.尝试删除dept_ ...
- MYSQL删除重复数据
delete from co_jobinformation cwhere c.name in (select cc.name from co_jobinformation cc group by ...
- sql查询删除重复数据
数据库UserInfo 删除重复数据 即删除重复的用户名手机号 同一个用户名手机号只保留一个用户 01.根据多个字段查询重复数据 with data1 as( select MobilePhone,N ...
- 取两个DataTable的交集,删除重复数据
/// <summary> /// 取两个DataTable的交集,删除重复数据 /// </summary> /// <param name="sourceD ...
- MSSQL如何在没有主键的表中删除重复数据
为了对重复数据进行实验,下面建一个设计不太好(没有主键)表并插入了一些重复数据: create database testdb use testdb ; go create table DupsNoP ...
随机推荐
- FFmpeg扩展开发
FFmpeg扩展开发 对FFmpeg RTMP/FLV部分做了扩展,用于支持H.265. 针对<video_file_format_spec_v10_1> VIDEODATA部分扩展如下: ...
- VB 老旧版本维护系列---有点懵逼的webserver访问
有点懵逼的webserver访问 '定义webserver地址 Dim postUrl As String = "" '定义webserver所需xml字符串参数 Dim xmlR ...
- AJAX第二天笔记
AJAX day1 jquery中的ajax 拦截请求: $.ajaxPrefilter() jquery方法请求参数的本质: 无论我们填写的何种形式的参数,都会被jQuery转换成查询字符串形式传 ...
- Redis系列(三):Bitmaps和HyperLogLog
本篇介绍Bitmaps和HyperLogLog. 一.Bitmaps 计算机中最小的单位是bit(位),很多计算机语言也提供了位操作符,比如Java中就有&.|.>>.>&g ...
- P1024 [NOIP2001 提高组] 一元三次方程求解
题目描述 有形如:a x^3 + b x^2 + c x + d = 0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在 -100至 ...
- 09:CBV与settings
CBV源码 # 切入点 url(r'^login/', views.Mylogin.as_view()) '''类名点名字还加括号 名字要么是绑定给类的方法 要么是无参函数''' 1.as_vie ...
- 【Azure 机器人】微软Azure Bot 编辑器系列(3) : 机器人对话流中加入帮助和取消按钮功能 (The Bot Framework Composer tutorials)
欢迎来到微软机器人编辑器使用教程,从这里开始,创建一个简单的机器人. 在该系列文章中,每一篇都将通过添加更多的功能来构建机器人.当完成教程中的全部内容后,你将成功的创建一个天气机器人(Weather ...
- Mybatis数据连接池的配置---增删改查(以及遇见的问题)
1.首先创建项目和各个文件,如图所示: 2.配置相关数据库连接 在jdbc.properties中加入 1 db.driver=com.mysql.jdbc.Driver 2 db.url=jdbc: ...
- DBA入门相关知识介绍
DBA(database administrator):数据库管理员 DBMS(database management system):数据库管理系 ...
- redis学习第三天(Java使用redis)
Java使用redis首先需要一个jar包,jedis.jar,这边给出下载地址:https://mvnrepository.com/artifact/redis.clients/jedis,要下载最 ...