我有一个查询,它用可变限制更新表中的多行。我需要从更新的行中获取数据,这样我才能确切知道哪些行受到了影响。我写了这个简单的过程:
DELIMITER $$
CREATE PROCEDURE select_update(IN myId INT, IN myAttr VARCHAR(10), IN myAmount MEDIUMINT)
begin
SELECT data FROM mytable WHERE id IS NULL AND attr = myAttr LIMIT myAmount;
UPDATE mytable SET id = myId WHERE id IS NULL AND attr = myAttr LIMIT myAmount;
end$$
DELIMITER ;
此SELECT语句是否始终返回与UPDATE语句影响的行完全相同的行?另一个用户是否可能在此过程运行时执行查询,从而可能在SELECT和UPDATE之间更改受影响的行?
发布于 2021-04-27 16:13:59
创建一个临时表来保存要更新的行的主键。
CREATE PROCEDURE select_update(IN myId INT, IN myAttr VARCHAR(10), IN myAmount MEDIUMINT)
begin
CREATE TEMPORARY TABLE temp_mytable AS
SELECT pk FROM mytable WHERE id IS NULL AND attr = myAttr LIMIT myamnt;
UPDATE mytable JOIN temp_mytable USING (pk)
SET mytable.id = myId;
SELECT mytable.data
FROM mytable JOIN temp_mytable USING (pk);
end$$
https://stackoverflow.com/questions/67286679
复制相似问题