我正在尝试创建一个SP,它将在一个表中的大约1亿行上运行批处理更新。我为它创建了下面的SP:
delimiter //
CREATE PROCEDURE `bulk_update`(IN table_name varchar(30))
BEGIN
DECLARE rows INT;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET rows = 1;
WHILE rows > 0
do
SET autocommit=1;
SET @query =CONCAT('update ',table_name,' set is_summarized="N";');
PREPARE update_stmt FROM @query;
EXECUTE update_stmt;
SET rows = row_count();
select sleep(1);
commit;
DEALLOCATE PREPARE update_stmt;
END WHILE;
END // 它给出了下面的误差>>
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rows INT;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET rows = 1;
' at line 3奇怪的是,我能够在MySQL5.6中创建SP,但只在MySQL-8中失败。有人能告诉我我错过了什么吗?谢谢
发布于 2020-04-26 01:18:31
要么始终使用autocommit=1,要么使用BEGIN和COMMIT。
而且,一旦设置完毕,就不需要再次设置autocommit。
因此,摆脱COMMIT并将SET从循环中移出。
在此proc处于休眠状态时,是否有其他进程更改is_summarized的值?我怀疑你的技巧是否能正确地抓住所有的边缘情况。
不要使用声明的rows,而是使用变量:@rows。它不需要是DECLAREd。
proc的大部分线路可以从循环中提取出来。(然而,这并没有什么区别。)
至于ROWS --大多数主要版本和一些次要版本都引入了新的关键字。ROWS显然是在5.6到8.0之间添加的。我用下划线为存储过程中的存储过程和声明变量前缀任何参数,从而避免了一些这样的错误。此约定还有助于避免变量和列名之间的混淆。
https://dba.stackexchange.com/questions/265494
复制相似问题