相关疑难解决方法(0)

MySQL 存储过程:遍历表,删除行。逻辑问题:不会因为查询中的 LIMIT 选项而退出循环

我创建了一个程序来循环遍历大型 InnoDB 表并删除一大块行,然后暂停并重复直到达到允许的最大字段值。

启用了二进制日志记录,但我将其保留为默认NONDETERMINISTIC设置,所以我认为这并不重要。

CALL 命令包括每行要删除的行数 ( num_rows),以及要删除的最后一个字段值 ( maxId)。(我正在使用主键 ID)。

第一部分工作正常,它循环遍历并每次通过删除一大块行。

有一个If语句来检查@z当前块的最后一个 id ( ) ,maxId如果最后一个 id 为空或大于 ,它应该退出循环maxId。但它永远不会触发并离开循环。

我无法确定我做错了什么,想法?


更新:
我已经确定了问题的根源,但我不确定如何解决它。

@z要删除的块的最后一个 id使用@sql_text2查询中的限制语句设置。

但最后,该查询中的限制选项导致它返回一个空结果集,因为偏移量大于结果集并且要返回的行数为 1。

例如,我运行了将在最后运行的查询,它返回一个空的结果集(为了清晰起见,更改了数字)。使用idkeyfield

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)

mysql stored-procedures

6
推荐指数
1
解决办法
3万
查看次数

MySQL select...into variable 产生 null,即使数据在那里

我的存储过程执行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)

mysql

2
推荐指数
1
解决办法
5465
查看次数

标签 统计

mysql ×2

stored-procedures ×1