Mysql循环删除或更新数据

使用前提:

1.删除或更新数据时,需要使用索引条件,并且控制每次更新或删除的行数。

2.更新后的数据不能再次被更新,可以通过where条件进行控制实现。

 

python3脚本如下

from pymysql import connect as MysqlConn   #pip3 install pymysql==0.9.3
from datetime import datetime
from time import sleep

def loop_delete_update(host,port,user,pswd,db,sql):
    conn = MysqlConn(host=host, port=port, user=user, passwd=pswd, db=db, charset='utf8')
    total_count = 0
    while True:
        with conn.cursor() as cursor:
            #cursor.execute("SET SQL_LOG_BIN=0")    #是否关闭当前会话的binlog日志,关闭后速度更快,但是操作不会同步到从库
            counts = cursor.execute(sql)
            conn.commit()
        total_count += counts
        print("%s\t%s"%(datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f"),total_count))  #执行进度
        if counts == 0:   #上一次更新或删除的行数为0时,退出循环
            break
        sleep(0.01)   #控制频率
    conn.close()


sql = "DELETE FROM test WHERE create_time < '2020-10-01 00:00:00' LIMIT 200 "
loop_delete_update("127.0.0.1",3306,"root","123456","test",sql)

 

Mysql存储过程

CREATE TABLE IF NOT EXISTS dba_loop_execute_delete_update_log(create_date datetime default CURRENT_TIMESTAMP,effect_rows int ) ENGINE=MEMORY;

DROP PROCEDURE IF EXISTS dba_loop_execute_delete_update;
DELIMITER ;;
CREATE PROCEDURE dba_loop_execute_delete_update()
BEGIN
		DECLARE effect_rows INT DEFAULT 0; #影响的总行数
		DECLARE effect_row INT DEFAULT 0;  #单次影响的行数

		outer_label:WHILE TRUE DO 

				##替换下面的脚本,进行自定义更新或删除
				DELETE FROM check_data_count WHERE id<100000 LIMIT 1000;  ##执行删除操作


				SELECT ROW_COUNT() INTO effect_row;  ##上一次执行影响的行数
				IF effect_row < 1 THEN   ##如果影响的行数小于1,则跳出循环
					LEAVE outer_label;
				ELSE
					 SET effect_rows=effect_rows + effect_row;
				END IF;

				#如果不需要写日志,看进度的话,此部分可以不需要
				IF MOD(effect_rows,10000) =0 THEN  ##每删除10000行,写一次日志
						INSERT INTO dba_loop_execute_delete_update_log(effect_rows) VALUES(effect_rows);
				END IF;

				SELECT SLEEP(0.1);   #控制频率
		END WHILE;

		#如果不需要写日志,看进度的话,此部分可以不需要
		INSERT INTO dba_loop_execute_delete_update_log(effect_rows) VALUES(effect_rows); #记录总的更新或删除的行数

END ;;
delimiter ;

CALL dba_loop_execute_delete_update();   ##执行存储过程
SELECT * FROM dba_loop_execute_delete_update_log; #查看进度,需要另开一个会话


DROP PROCEDURE IF EXISTS dba_loop_execute_delete_update;
DROP TABLE IF EXISTS dba_loop_execute_delete_update_log;

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值