MySQL 大表分批次更新存储过程

DROP PROCEDURE IF EXISTS big_table_update;
CREATE PROCEDURE big_table_update()
BEGIN
	# 每批次处理的记录条数,可自行修改
	DECLARE v_update_limit INT(10) DEFAULT 5;
    DECLARE v_primary_key_start, v_primary_key_end BIGINT(20) DEFAULT 0;

    # 异常捕获
    DECLARE v_error_code CHAR(5) DEFAULT '00000';
    DECLARE v_error_message VARCHAR(512) DEFAULT '';
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
            GET DIAGNOSTICS CONDITION 1 v_error_code= RETURNED_SQLSTATE,v_error_message= MESSAGE_TEXT;
            INSERT INTO error_log(type, title, code, message) VALUES ('test', 'big_table_update', v_error_code, v_error_message);
            COMMIT;
        END;

    WHILE EXISTS(SELECT 1 FROM big_table WHERE id > v_primary_key_start)
        DO
        BEGIN
            START TRANSACTION;
            # 查询当前批次处理的最大的主键
            SELECT id INTO v_primary_key_end FROM (SELECT id 'id' FROM big_table WHERE id > v_primary_key_start LIMIT v_update_limit) temp ORDER BY temp.id DESC  LIMIT 1;

            ##################### 自定义更新数据语句【开始】#####################
            UPDATE big_table SET mobile = mobile + 1 WHERE id BETWEEN v_primary_key_start AND v_primary_key_end;
            ##################### 自定义更新数据语句【结束】#####################

            # 重新设置主键起始值
            SET v_primary_key_start = v_primary_key_end + 1;
            COMMIT;
            # 暂停5毫秒
            SELECT SLEEP(0.005);
        END;
        END WHILE;
        ROLLBACK;
END;

# 测试执行
CALL big_table_update();

big_table 表结构及数据

CREATE TABLE big_table
(
    id     INT AUTO_INCREMENT
        PRIMARY KEY,
    mobile INT NULL
);
INSERT INTO big_table (id, mobile) VALUES (1, 1);
INSERT INTO big_table (id, mobile) VALUES (2, 2);
INSERT INTO big_table (id, mobile) VALUES (3, 3);
INSERT INTO big_table (id, mobile) VALUES (4, 4);
INSERT INTO big_table (id, mobile) VALUES (5, 5);
INSERT INTO big_table (id, mobile) VALUES (6, 6);
INSERT INTO big_table (id, mobile) VALUES (7, 7);
INSERT INTO big_table (id, mobile) VALUES (8, 8);
INSERT INTO big_table (id, mobile) VALUES (9, 9);
INSERT INTO big_table (id, mobile) VALUES (10, 10);
INSERT INTO big_table (id, mobile) VALUES (11, 11);
INSERT INTO big_table (id, mobile) VALUES (12, 12);
INSERT INTO big_table (id, mobile) VALUES (13, 13);
INSERT INTO big_table (id, mobile) VALUES (14, 14);
INSERT INTO big_table (id, mobile) VALUES (15, 15);
INSERT INTO big_table (id, mobile) VALUES (16, 16);
INSERT INTO big_table (id, mobile) VALUES (17, 17);
INSERT INTO big_table (id, mobile) VALUES (18, 18);
INSERT INTO big_table (id, mobile) VALUES (19, 19);
INSERT INTO big_table (id, mobile) VALUES (20, 20);
INSERT INTO big_table (id, mobile) VALUES (21, 21);
INSERT INTO big_table (id, mobile) VALUES (22, 22);

error_log 表结构

CREATE TABLE error_log
(
    id          INT AUTO_INCREMENT
        PRIMARY KEY,
    type        VARCHAR(128)                        NULL,
    title       VARCHAR(128)                        NULL,
    code        VARCHAR(128)                        NULL,
    message     TEXT                                NULL,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL
);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你不想使用存储过程,你可以使用编程语言(如Python、Java等)来实现分批删除数据的逻辑。下面是一个使用Python进行分批删除的示例: ```python import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', user='your_username', password='your_password', database='your_database') cursor = conn.cursor() # 设置每次删除的数据量 batch_size = 1000 # 删除数据的条件 condition = "your_condition" # 获取总记录数 cursor.execute(f"SELECT COUNT(*) FROM your_table WHERE {condition}") total_rows = cursor.fetchone()[0] # 计算总共需要执行的批次数 total_batches = (total_rows + batch_size - 1) // batch_size # 循环执行删除操作 for batch in range(total_batches): # 获取当前批次的起始位置 offset = batch * batch_size # 构造删除语句 delete_query = f"DELETE FROM your_table WHERE {condition} LIMIT {offset}, {batch_size}" # 执行删除操作 cursor.execute(delete_query) conn.commit() # 关闭数据库连接 cursor.close() conn.close() ``` 请将示例代码中的 `your_username`、`your_password`、`your_database`、`your_table` 和 `your_condition` 替换为你实际的数据库信息和删除条件。 这段代码会根据指定的每次删除的数据量(`batch_size`),计算总共需要执行的批次数,并在每个批次中执行相应的删除操作。注意在循环中使用 `LIMIT` 子句来限制每次删除的数据量。 在执行代码之前,请确保已经安装了相应的数据库驱动(如`pymysql`),并根据实际情况修改连接数据库的参数。同样,建议在非高峰期执行以减少对系统的影响,并确保已备份重要数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值