mysql 循环删除_MySQL循环删除或更新数据,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;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值