簡體   English   中英

使用 SELECT 的結果集...用於更新 MySQL 存儲過程

[英]Use ResultSet of SELECT...FOR UPDATE in MySQL Stored Procedure

我正在使用 MySql 5.7 嘗試創建一個存儲過程,該過程將更新事務中的一組行並返回已更新的行。 創建鎖后,我會更新這些行,但無法弄清楚如何使用從SELECT...FOR UPDATE語句返回的 ID。 相反,我必須在更新語句中再次掃描表以查找我剛剛鎖定的行。 這是我的程序的一個例子。

DELIMITER //
CREATE PROCEDURE cleanUp()
BEGIN
        START TRANSACTION;

        SELECT * FROM t WHERE t.state = 'foobar' AND t.value < 10 FOR UPDATE;

        UPDATE t SET t.state = 'fizzbuzz' WHERE t.state = 'foobar' AND t.value < 10;

        COMMIT;
END //

我寧願不必為t.state = 'foobar' AND t.value < 10掃描兩次表。 我還想保證我更新我剛剛鎖定的行,而不更新可能已更改以滿足交易中的標准的其他行。

有沒有辦法在UPDATE語句中使用SELECT..FOR UPDATE的結果,這樣我就可以通過 id 更新行?

注意:我已嘗試將結果加載到臨時表中並使用 cursor,但兩者均無效。

MySQL 不能將變量聲明為表,因此您需要將 select 寫在 FROM 子句中,例如可以像下面的查詢一樣執行 IN 子句

CREATE TABLe t(id int, state varchar(10), value int)
 INSERT INTO t VALUEs(1,'foobar',1),(2,'foobar',1),(3,'foobar',1)
 CREATE PROCEDURE cleanUp() BEGIN START TRANSACTION; UPDATE t SET t.state = 'fizzbuzz' WHERE id IN (SELECT id FROM (SELECT id FROM t WHERE t.state = 'foobar' AND t.value < 10 FOR UPDATE) t1 ); COMMIT; END
 CALL cleanUp()
 SELECT * FROM t
 編號 |  state | 值 -: |:------ |  ----: 1 | 嘶嘶聲 |  1 2 | 嘶嘶聲 |  1 3 | 嘶嘶聲 |  1個

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM