MySQL-同时选择和更新

MySQL-同时选择和更新,mysql,Mysql,我有这个疑问 SELECT * FROM outbox where Status=0 ; 然后我需要更新所选记录,以便状态应等于1 i、 e从选择查询集状态=1更新outboxselected记录 有什么帮助吗?您可以这样做,发件箱就是您的桌子: update outbox set Status = 1 where Status = 0 你可以像下面这样做 $sql=mysql_query("SELECT * FROM outbox where `Status`=0"); while($re

我有这个疑问

SELECT * FROM outbox where Status=0 ;
然后我需要更新所选记录,以便状态应等于1

i、 e从选择查询集状态=1更新outboxselected记录


有什么帮助吗?

您可以这样做,发件箱就是您的桌子:

update outbox set Status = 1 where Status = 0

你可以像下面这样做

$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');
}

这是一个比听起来困难得多的问题。是的,在简单化的情况下,您只考虑一个用户和几个记录,这似乎很容易。但是,数据库被设计为与ACID兼容,具有多个用户和多个并发事务,这些都可能同时影响数据。MySQL中没有一条语句可以实现您希望其他数据库支持的输出子句、返回语句或类似语句

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;
对于更新,我实际上更喜欢:

    where exists (select 1 from TempOutboxStatus0 t where t.outboxid = o.outboxid);
因为它的意图更明确,而且在条件发生微妙变化时,代码更安全

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

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

这可能吗。。它似乎对我有效

为什么需要先选择?表中是否有id列?您的意思是要更新并立即获取所有更新的记录?请查看。我想你也在问同样的问题。我需要选择查询的结果集在我的应用程序中使用,然后我需要更新这个结果集!!仅供参考此代码是存储过程的一部分什么是查询?表?@IslamMuntasser但第一个查询的结果集是状态为0的每一行?!查询从状态为0的发件箱中选择*;这将是结果集,然后我需要更新此结果集,因此状态将为1,因此如何在同一查询中更新和选择@伊斯兰蒙塔瑟:您不能在同一个查询中更新和选择。但这样做很少是必要的:您尝试这样做可能表明在这一过程中做出了糟糕的设计决策@草莓在上面询问了你为什么要尝试它的更多信息,答案将帮助我们提出更好的设计。但是,目前情况下,由于此代码是存储过程的一部分,您只需先执行SELECT,然后再执行更新:存储过程将从SELECT输出结果集,然后更新表的内容。是什么让您认为OP使用了这种语言?我刚刚看到了mysql查询,所以我认为soI编写了mysql存储过程。。但我不知道这是什么语言?我用mysql和php写的。你可以用你自己的方式来使用它,我只是在描述逻辑,没有其他任何东西,除非绑定在一个事务中,这是一个糟糕的想法。这也是不必要的。如何防止在创建临时表和更新命令之间更新发件箱?当然,应该使用锁定读取,例如,为UDPATE从状态为0的发件箱中选择*,这样做可以避免需要临时表?@eggyal。没有什么然而,事务应该确保ACID遵从性——尽管在MySQL中可能并不总是如此。我关心的不是选择过程中的更新。它是选择和更新之间的更新。