1. 程式人生 > 其它 >使用pymysql迴圈刪除重複資料,並修改自增欄位偏移值

使用pymysql迴圈刪除重複資料,並修改自增欄位偏移值

建立表:

CREATE TABLE `info` (
`id` tinyint NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 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 a.id from
(select max(id) id from info group by `name` having count(`name`)>1 ) a
)
但這個辦法,一次只能幹掉重複資料的最大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 a.id from '
'(select max(id) id from info group by `name` having count(`name`)>1 ) a'
' ) ')
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]]) # 重置自增欄位偏移值為行數。