簡體   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