如何在 MySQL 上正确循环存储函数?

2023-11-24

我在正确执行一个非常简单的存储过程时遇到了一些困难。 考虑以下文章表片段:

id    replaced_by     baseID
 1              2          0
 2              3          0
 3              0          0

一个简单的分层表,使用写时复制。编辑文章时,当前文章的 Replaced_by 字段将设置为其新副本的 ID。

我添加了一个 baseID 字段,将来应该存储文章的 baseID。 在我上面的示例中,有一篇文章(例如 id 3)。它的 baseID 将为 1。

为了获取 baseID,我创建了以下存储过程:

DELIMITER $$

CREATE FUNCTION getBaseID(articleID INT) RETURNS INT
BEGIN
    DECLARE x INT;
    DECLARE y INT;
    SET x = articleID;
    sloop:LOOP
        SELECT id INTO y FROM article WHERE replaced_by_articleID = x;
        IF y IS NOT NULL THEN
            SET x = y;
            ITERATE sloop;
        ELSE
            LEAVE sloop;
        END IF;  
    END LOOP;
    RETURN x;
END $$

DELIMITER ;

这看起来很简单,直到我实际使用以下方法调用该函数:

SELECT getBaseID(3);

我希望函数返回 1。我什至愿意理解它可能需要一秒钟的时间。 相反,机器的 CPU 上升到 100% (mysqld)。

我什至使用重写了相同的函数REPEAT .. UNTILWHILE .. DO,最终结果相同。

谁能解释一下为什么我的CPU在进入循环时会上升100%?

旁注:我只是想赢得时间。我在 PHP 中创建了完全相同的函数,它执行得不错,但我们猜测 MySQL 可以做得更快一些。我们需要筛选大约 1800 万条记录。我能节省的任何一点时间都是值得的。

预先感谢您的任何帮助和/或指示。


已解决的SQL:

DELIMITER $$

CREATE FUNCTION getBaseID(articleID INT) RETURNS INT
BEGIN
    DECLARE x INT;
    DECLARE y INT;
    SET x = articleID;
    sloop:LOOP
        SET y = NULL;
        SELECT id INTO y FROM article WHERE replaced_by_articleID = x;
        IF y IS NULL THEN
            LEAVE sloop;
        END IF;  
        SET x = y;
        ITERATE sloop;
    END LOOP;
    RETURN x;
END $$

DELIMITER ;

From mysql :

如果查询没有返回行,则会出现错误代码 1329 的警告(无数据),并且变量值保持不变

因此,当没有找到给定的记录时,就会出现无限循环x (y保持不变) 尝试SET y = (SELECT id ....)相反或添加SET y = null在 select 语句之前(它应该是循环中的第一个语句)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 MySQL 上正确循环存储函数? 的相关文章

随机推荐

  • 原因:retrofit.RetrofitError:方法 POST 必须有请求正文

    我正在使用 Retrofit 进行 API 后调用 在尝试访问端点时收到以下错误 Caused by rx exceptions OnErrorNotImplementedException method POST must have a
  • UNIX 域套接字和 Cocoa

    我想在 Cocoa 应用程序中使用 UNIX 域套接字实现 IPC 但我对此没有经验 我找到了苹果的CF本地服务器示例项目 但它是用 C 编写的 看起来相当复杂 是的 我已经阅读了其中的大部分内容 CFLocalServer 中演示的技术是
  • 使用 groupby 获取组中具有最大值的行

    如何找到 pandas DataFrame 中具有最大值的所有行count分组后的列 Sp Mt 列 示例1 以下数据框 Sp Mt Value count 0 MM1 S1 a 3 1 MM1 S1 n 2 2 MM1 S3 cb 5 3
  • 为什么必须定义未使用的虚函数?

    我觉得很奇怪的是 与未使用的普通函数不同 未使用的虚拟函数仍然必须被定义 我对隐含的内容有些了解vtables and v指针它们是在创建类对象时创建的 这在某种程度上回答了这个问题 必须定义该函数 以便可以定义指向虚函数的指针 但这将我的
  • 在 cabal 上使用 extra-lib-dirs 的相对路径

    我有一个 C 库 myboo 其中包含 Makefile 我想制作这个库的包装 我不想将其安装到 usr local 中 因为 myboo 不是主要模块 另外 建议我构建 myboo 而不是动态库 但作为静态库 我制作自定义Setup py
  • Dapper 和 MS Access - 读取有效,写入无效

    让我们首先解决这个问题 我一直在使用 MS Access DB 而且无法更改它 这工作正常 using OleDbConnection conn ConnectionHelper GetConnection conn Open var re
  • Grails 文件上传问题

    我正在尝试模拟 grails 网站的文件上传代码 但遇到了一些问题 我使用的代码与找到的相同here 这是我的代码
  • 从外部调用 React 组件方法

    我想从 React 元素的实例调用 React 组件公开的方法 例如 在这个jsfiddle 我想打电话给alertMessage方法从HelloElement参考 有没有一种方法可以实现这一点而无需编写额外的包装器 Edit 从 JSFi
  • XSLT 样式表用空的配对标签替换自关闭标签

    我正在使用 XSLT 处理 ASP Net web config 文件以插入一些额外的 log4net 配置 它由称为 NANT 标准任务的应用
  • Firebase Unity3D 桌面应用程序 (Mac/PC) - 是否有效?

    Firebase 在此处的文档中 文件 A https firebase google com docs unity setup 它声称它现在适用于桌面版本 因此 您可以统一创建 Mac 应用程序或 Windows 应用程序 它确实可以在
  • 动态单选按钮控制

    代码 private void createRadioButton final RadioButton rb new RadioButton 5 for int i 0 i lt 5 i rb i new RadioButton this
  • 实体框架:单例 ObjectContext - 好、坏还是想太多?

    这个想法是创建一个公开上下文但处理它在 Web 应用程序中的存储的类 目前 这就是我所拥有的 public class EntityContext private static String MAIN CONTEXT KEY MainCon
  • GAE/J 请求日志格式细分

    以下是 GAE 控制台日志记录的示例 https i stack imgur com M2iJX png for readable high res version 我想提供文件的详细信息 显示在折叠 摘要 视图和展开 详细 视图中 我将填
  • 有人成功构建了 Cygwin 版本的 GHC 吗?

    有没有人成功构建了 GHC 的 Cygwin 版本 自从 Haskell 从使用 Cygwin 切换到 MinGW 来自哈斯克尔网站 GHC 的目标是 MinGW 而不是 Cygwin 原则上可以构建一个针对 Cygwin 的 GHC 版本
  • 将 HTML 源代码保存到文件

    如何在 Python 3 中将网站的源代码复制到文本文件中 编辑 为了澄清我的问题 我有以下内容 import urllib request def extractHTML url f open temphtml txt w page ur
  • malloced 数组 VS.malloced 数组可变长度数组[重复]

    这个问题在这里已经有答案了 有两种方法可以为数组分配内存 数组的大小一开始是未知的 最常见的方法是使用malloc像这样 int array when we know the size array malloc size sizeof in
  • 无法从“node_modules/expo/AppEntry.js”解析“../../App”

    我正在用 expo 制作一个 vue 原生应用程序 升级到 expo 版本 33 时 出现以下错误 无法从 node modules expo AppEntry js 解析 App 需要升级到版本 33 是 因为我需要 expo 文件系统模
  • 使用 LLVM 进行源到源编译[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要将 x86 汇编源代码转换为 LLVM 人类可读的 ll 文件 又名 LLVM 汇编语言 我怎样才能做到这一点 如果没有直接的解决方案 是否有
  • 将 json 提交到 MVC3 操作

    我有一个用 Knockout js 创建的表单 当用户按下提交按钮时 我将视图模型转换回模型并尝试提交到服务器 我试过 ko utils postJson location href ko toJSON viewModel 但该对象在到达服
  • 如何在 MySQL 上正确循环存储函数?

    我在正确执行一个非常简单的存储过程时遇到了一些困难 考虑以下文章表片段 id replaced by baseID 1 2 0 2 3 0 3 0 0 一个简单的分层表 使用写时复制 编辑文章时 当前文章的 Replaced by 字段将设