我创建了一个程序来循环遍历大型 InnoDB 表并删除一大块行,然后暂停并重复直到达到允许的最大字段值。
启用了二进制日志记录,但我将其保留为默认NONDETERMINISTIC设置,所以我认为这并不重要。
CALL 命令包括每行要删除的行数 ( num_rows),以及要删除的最后一个字段值 ( maxId)。(我正在使用主键 ID)。
第一部分工作正常,它循环遍历并每次通过删除一大块行。
有一个If语句来检查@z当前块的最后一个 id ( ) ,maxId如果最后一个 id 为空或大于 ,它应该退出循环maxId。但它永远不会触发并离开循环。
我无法确定我做错了什么,想法?
更新:
我已经确定了问题的根源,但我不确定如何解决它。
@z要删除的块的最后一个 id使用@sql_text2查询中的限制语句设置。
但最后,该查询中的限制选项导致它返回一个空结果集,因为偏移量大于结果集并且要返回的行数为 1。
例如,我运行了将在最后运行的查询,它返回一个空的结果集(为了清晰起见,更改了数字)。使用id为keyfield:
SELECT id FROM table_name WHERE id >= 7000 ORDER BY id LIMIT 1000,1;
Run Code Online (Sandbox Code Playgroud)
@sql_text2程序将运行的查询(使用INTO @z):
SELECT id INTO @z FROM table_name WHERE id >= 7000 ORDER BY id LIMIT 1000,1; …Run Code Online (Sandbox Code Playgroud) 我的存储过程执行SELECT ... INTO var产生 NULL,但如果我SELECT自己重复相同的操作,我会得到一个值。
这是架构的相关部分
CREATE TABLE UrlAuthority
(
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY
,name VARCHAR(255) NOT NULL COMMENT 'includes TLD suffix'
,UNIQUE(name)
)
ENGINE = INNODB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE UrlFqdn
(
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY
,authority BIGINT NOT NULL COMMENT 'references example.com'
,name VARCHAR(255) NOT NULL COMMENT 'host.example.com'
,FOREIGN KEY (authority) REFERENCES UrlAuthority (id)
,UNIQUE (authority, name)
)
ENGINE = INNODB DEFAULT CHARACTER SET …Run Code Online (Sandbox Code Playgroud)