MySQL通过存储过程从带有LIMIT的Update查询中获取行数据



我有一个查询,它用变量LIMIT更新表中的多行。我需要从更新的行中获取数据,这样我才能知道哪些行受到了影响。我写了一个简单的程序:

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之间更改受影响的行?

创建一个临时表来保存要更新的行的主键。

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$$

最新更新