MySQL-同时选择和更新

时间:2015-03-21 11:18:59

标签: mysql

我有这个查询

SELECT * FROM outbox where Status=0 ;

然后我需要更新所选记录,以便状态应该等于1

即(UPDATE outbox(selected records from SELECT query) SET Status =1

任何帮助?

4 个答案:

答案 0 :(得分:1)

你可以做类似的事情,发件箱就是你的桌子:

update outbox set Status = 1 where Status = 0

答案 1 :(得分:0)

这比听起来要困难得多。是的,在简单的情况下,你只想到一个用户和一些记录,这似乎很容易。但是,数据库被设计为符合ACID,具有多个用户和多个并发事务,这些事务可能同时影响数据。并且MySQL中没有单一的语句能够满足您的需求(其他数据库支持OUTPUT子句,RETURNING或类似的东西。

在MySQL中可以使用的一种结构是将项目放在临时表中,然后进行更新,然后返回它们。以下显示了使用事务的语义:

start transaction;

create temporary table TempOutboxStatus0 as
    select *
    from outbox
    where status = 0;

update outbox o
    set status = 1
    where status = 0;

select *
from TempOutboxStatus0;

commit;

对于update,我实际上更喜欢:

    where exists (select 1 from TempOutboxStatus0 t where t.outboxid = o.outboxid);

因为它的意图更清晰 - 如果条件略有变化,代码会更安全。

注意:您可能希望使用显式表锁。这些注意事项取决于您使用的存储引擎。

答案 2 :(得分:0)

BEGIN
        Start transaction;
        SELECT * 
            FROM 
                outbox 
            where 
                Status = 0 and
                Is_Expired = 0 and
                Service_ID=p_service_id
        order by    
                Next_Try_Date asc FOR Update;          

        update outbox 
            set 
                Status=1 
            where
                Status = 0 and
                Is_Expired = 0 and
                Service_ID=p_service_id;
        commit;

END

这可能......似乎它适用于我

答案 3 :(得分:-2)

你可以像下面这样做

$sql=mysql_query("SELECT * FROM outbox where `Status`=0");
while($result=mysql_fetch_array($sql))
{
$update="UPDATE `outbox` SET `Status` =1 where 
'your column name'='your previous fetched value');
}