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




     
  • 相关阅读:
    暑期测试训练3
    对于在线段树上修改整段区间的理解
    UVA 11090 判负圈问题
    ZOJ 2588 求割边问题
    POJ 1523 网络连通
    hdu 1163
    hdu 1703
    hdu 2577 模拟
    hdu 3836 强连通+缩点:加边构强连通
    hdu 2571
  • 原文地址:https://www.cnblogs.com/qqq789001/p/15046472.html
Copyright © 2020-2023  润新知