使用pymysql循环删除重复数据,并修改自增字段偏移值

使用pymysql循环删除重复数据,并修改自增字段偏移值创建表: CREATE TABLE `info` ( `id` tinyint NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMAR

使用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错误。




 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6012.html

(0)
上一篇 2023-04-19
下一篇 2023-04-19

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注