zoukankan      html  css  js  c++  java
  • 使用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错误。




     
  • 相关阅读:
    表单参数使用场景
    [自己项目中的]表单定制的限制
    堂妹发给我的
    处理针式打印的宽度超界的一些办法(一)
    delegate或event序列化的一个问题
    让图片出现幻影效果的CSS代码
    鼠标悬停出现图片提示的代码
    用CSS实现的图片透明度链接效果代码
    让图片水平循环飞舞的JavaScript代码
    Javascript+CSS实现漂亮带缓冲效果的图片展示代码
  • 原文地址:https://www.cnblogs.com/qqq789001/p/15046472.html
Copyright © 2011-2022 走看看