如何使用 MYSQL 在循环中分块或批量执行数据

分享于2022年07月17日 mysql sql 问答
【问题标题】:如何使用 MYSQL 在循环中分块或批量执行数据(How to execute the Data in chunks or Batch wise in loop using MYSQL)
【发布时间】:2022-01-24 06:34:48
【问题描述】:

我的表有 2000 万条记录。我最近在该表中添加了另一列。 我需要将数据更新到该列中。 我正在使用 MYSQL 社区版,当我执行这样的直接更新时:

Update Employee SET Emp_mail = 'xyz_123@gmail.com'

系统被挂起,需要突然关闭执行。 但是当我用过滤条件更新语句时,它执行得很好。

Update Employee SET Emp_mail = 'xyz_123@gmail.com' where ID <= 10000;
Update Employee SET Emp_mail = 'xyz_123@gmail.com' where ID >= 10000 AND ID <= 10000 ;

--------
--------
no of  Times

现在我正在寻找可以分块执行的循环脚本。

例如在 SQL 中是这样的,但我不确定 MYSQL:

BEGIN 
I int = 0 ;
cnt = 0 ;
while 1 > cnt
SET  i = i + 1; 
Update Employee SET Emp_mail = 'xyz_123@gmail.com' where ID >= cnt AND ID <= I

END

注意:这是一个随机脚本语法,可能会有一些错误。请忽略它。

我正在寻找 MYSQL 中的循环

  • 有更新限制的子查询呢?
  • 任何方法都可以,只要它在批量更新@AnkitSharma
  • 也许会提到有问题的 Adhoc 部分

【解决方案1】:

在像 MySQL 这样的基于行的数据库系统中,如果您需要更新每一行,您应该真正探索一种不同的方法:

ALTER TABLE original_table RENAME TO original_table_dropme;

CREATE TABLE original_table LIKE original_table_dropme;

ALTER TABLE original_table ADD emp_mail VARCHAR(128);

INSERT INTO original_table SELECT *,'xyz_123@gmail.com'
FROM original_table_dropme;

然后,可能会保留原始表一段时间 - 尤其是将任何约束、主键和授权从旧表转移到新表 - 最后删除 %_dropme 表。

在基于行的数据库中,每次将先前为空的列更新为某个值,都会使每一行都比原来的更长,并且需要在内部进行重组。如果您对数百万行执行此操作,所需的工作量将成倍增加。

  • 我没有删除权限@marc 这对我没有帮助
  • 与 dbadmin 讨论该问题。他很可能会让你 - 因为与更新相比,这种方法对“他的”数据库的压力会小得多。
  • 或者,想一想:你可以删除 emp_mail 列,然后: ALTER TABLE original_table ADD emp_mail VARCHAR(128) DEFAULT 'xyz_123@gmail.com'; 吗? DDL 命令的侵入性可能比 DML 低,如果出现问题,您需要能够回滚。
  • 我只查看循环语句