繁体   English   中英

带有插入选择和用户变量的MySQL存储过程

[英]MySQL Stored Procedure with Insert Select and user variable

问题:我有一个MySQL存储过程,我想在每次调用该过程时将用户变量重置为0,但是该变量似乎正在记住上一次运行时的值,因此我无法将其初始化为零。

详细信息:我有一个数据表(称为data ),可以从中读取该数据表,然后在另一个表(称为results )中以1对1的相关关系生成记录。 我在利用插入选择语句的存储过程中执行此操作。 我还使用了一个用户变量@mycount ,该变量随每行递增。 这是我的代码的简化版本:

DELIMITER //
CREATE PROCEDURE doSomething
BEGIN
    SET @mycount := 0;
    INSERT INTO results (data_id, mycounter)
        SELECT data.id, (@mycount := @mycount+1)
        FROM data LEFT JOIN results ON data.id = results.data_id
        WHERE ... GROUP BY ...
        HAVING ...
        ORDER BY ...;
END //
DELIMITER ;

分析:这几乎可以@mycount工作,只是我每次运行时都需要@mycount重置为零,并且上面的SET语句无法实现该目的。 调试时,我可以看到在存储过程的上一次运行中始终会记住@mycount的最后一个值。 我也尝试在插入后将其设置为零。

笔记:

  1. 我正在使用@变量来递增并跟踪行号。 也许这里还有另一种选择?
  2. 该问题似乎与Haveing子句有关。 当我运行类似但不同的查询而没有Have子句时,该变量将不会出现任何问题。

问题:为什么每次运行前我@mycount设置为零? 如果正在重置,并且仅仅是我的Haveing子句导致意外计数,是否有更好的方法重写SQL?

我希望有人遇到类似的情况,因为这似乎很晦涩。

我认为您正在使用会话变量(即@mycount)。请在下面的网站上查看您的答案

MySQL:@variable与变量。 有什么不同?

我找不到您的代码不起作用的任何原因。 无论如何,请尝试以下方法。

INSERT INTO results (data_id, mycounter)
select a.id, a.cnt from (
select @mycount := 0 from dual
join ( SELECT data.id, (@mycount := @mycount+1) cnt
        FROM data LEFT JOIN results ON data.id = results.data_id
        WHERE ... GROUP BY ...)) a;

在这种情况下,您无需指定SET @mycount := 0;

在下面的SQL Fiddle中,我无法重现您提出的问题,理论上可以按预期工作。

UPDATE

尝试:

DELIMITER //

CREATE PROCEDURE doSomething()
BEGIN
    SET @mycount := 0;
    INSERT INTO results (data_id, mycounter)
        SELECT der.id, (@mycount := @mycount + 1)
        FROM (
            SELECT data.id
            FROM data
                LEFT JOIN results ON data.id = results.data_id
            WHERE ...
            GROUP BY ...
            HAVING ...
            ORDER BY ...
        ) der;
END //

DELIMITER ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM