在MYSQL存储过程中选择并更新相同的行

在MYSQL存储过程中选择并更新相同的行,mysql,select,stored-procedures,sql-update,Mysql,Select,Stored Procedures,Sql Update,我正在处理一个应用程序,我需要一次读取m行,其中m

我正在处理一个应用程序,我需要一次读取m行,其中m

例如考虑下表

+------+-------------------------+--------------------------+----------+-------+---------+------+
| ID   | from_email_address      | to_email_address         | subject  | body  | inqueue | sent |
+------+-------------------------+--------------------------+----------+-------+---------+------+
|    1 | 0120sushil@gmail.com    | kumar.sushil@outlook.com | Subject1 | Body1 |            0 |    0 |
|    2 | 0120ksushil@gmail.com   | kumar.sushil@outlook.com | Subject1 | Body1 |          0 |    0 |
|    3 | shivaseth1@gmail.com    | kumar.sushil@outlook.com | Subject1 | Body1 |       0     |    0 |
|    4 | shivaseth1@gmail.com    | amanrajg@outlook.com     | Subject1 | Body1 |       0     |    0 |
|    5 | shivamprakash@gmail.com | amanrajg@outlook.com     | Subject1 | Body1 |           0 |    0 |
|    6 | shivamprakash@gmail.com | poorvanagpal@outlook.com | Subject1 | Body1 |       0 |    0 |
|    7 | shivankgupta@gmail.com  | poorvanagpal@outlook.com | Subject1 | Body1 |       0 |    0 |
+------+-------------------------+--------------------------+----------+-------+---------+------+
我想一次读3行,读完这些行后,我想将这些行的inqueue状态设置为1

我可以在存储过程中使用以下查询来选择行

select * from EmailQueue where inqueue=1 LIMIT 3
在此之后,如何更新相同的行并将其inqueue设置为1

编辑

下面是我创建的存储过程,它给出了一些错误

DELIMITER $$
DROP PROCEDURE IF EXISTS GetUnsentMails;
CREATE PROCEDURE GetUnsentMails()
BEGIN
START TRANSACTION;
    CREATE TEMPORARY TABLE temp_EmailQueue AS SELECT * FROM EmailQueue WHERE inqueue = 0 LIMIT 5 FOR UPDATE;
    UPDATE EmailQueue SET inqueue=1 where id in (SELECT id from temp_EmailQueue) AND inqueue = 0;
COMMIT;
END
它在调用时给出以下错误


错误1746 HY000:在创建“临时电子邮件队列”时无法更新表“电子邮件队列”。

建议使用事务并选择更新以满足您的要求

有关示例,请参阅以下链接:

更新-添加了查询示例:

例如:

.......
#Before starting procedure
.......
START TRANSACTION;
CREATE TEMPORARY TABLE zzz_EmailQueue AS SELECT * FROM EmailQueue WHERE inqueue=1 LIMIT 3 FOR UPDATE;
.....
.....
#Section for other activities....
.....
.....
UPDATE EmailQueue SET inqueue=<<New_Value>> WHERE id IN (SELECT id FROM zzz_EmailQueue) AND inqueue=1;
COMMIT;
.......
#Remaining lines of Prodecure
.......

那很好。但是,要使用什么查询来更新那些仅由SELECT query选择的行呢?我尝试了您的解决方案,但当我调用该过程时,它显示错误1746 HY000:在创建“zzz_emailqueue”时无法更新表“emailqueue”。请检查更新。您正在起诉哪个版本的Mysql?我已经在Mysql 5.5.27中验证了上述方法。我正在使用Mysql 5.6.19!!!无论如何,可以使用变量而不是临时变量来保存EmailQueueID,如果一次只能处理一个电子邮件队列(即限制1),您将更新该ID。
DECLARE v_EmailQueue_ID DOUBLE;
SELECT ID INTO v_EmailQueue_ID FROM EmailQueue WHERE inqueue = 0 LIMIT 1 FOR UPDATE;
UPDATE EmailQueue SET inqueue=1 WHERE id=v_EmailQueue_ID AND inqueue = 0;