mySQL:在一个查询中处理SELECT和UPDATE?

时间:2016-05-31 07:32:31

标签: mysql sql

在mySQL表inv中有3列:IDnumstate
state有3个值:0 =未使用,1 =已使用,2 =已保留 要获取下一个未使用的num,我使用此查询:

SELECT num FROM inv WHERE state = 0   

当查询返回num时,我需要更新记录并将state设置为2 =保留。

UPDATE inv SET state = 2 Where ID = id 

我知道有一种方法可以在一个查询中执行此操作,但是如何?

赞赏任何有帮助的答案

编辑:

我想要实现这个目标:

我需要生成具有唯一数字的发票。所以我获取下一个空闲,未使用的数字,状态= 0,然后返回此数字并在同一查询中将返回的记录设置为state = 2,因此没有其他人会同时使用它。后来当我成功生成一个完美的发票时,我用state = 1(used)更新了这条记录。如果生成发票完美无效,我将状态设置回0 =未使用。

希望我能更清楚地表达我的方法。

5 个答案:

答案 0 :(得分:2)

  

更新inv set state = 2其中id in(从inv where中选择id)   state = 0 limit 1);

这将获得下一个单个num值并将其更新为保留。

更新回答:

由于限制子句在MySQL中与子查询一起使用受限制,因此上述查询无法解决,我对此给出错误答案表示歉意。

所以我提出了另一种方法,类似于这里给出的答案:

update inv a join (select id, num from inv where state=0 limit 1) b
 on a.id = b.id SET state=2;

此查询已使用样本数据进行验证。

答案 1 :(得分:1)

试试这个;)

SET @num = null;
SET @id = null;
SELECT id into @id FROM inv WHERE state = 0 LIMIT 1;
SELECT num into @num FROM inv WHERE id = @id;

PREPARE stmt FROM 'UPDATE inv SET state = 2 Where ID = ?' USING @id;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SELECT @num;

答案 2 :(得分:0)

update inv a join (select num from inv where state= 0) b on a.id = b.id
SET state = 2;

答案 3 :(得分:-1)

这有用吗?

UPDATE inv SET state = 2 Where ID IN (SELECT id FROM inv WHERE state = 0)

答案 4 :(得分:-1)

SELECT num FROM inv WHERE state = 0     
UPDATE inv SET state = 2 Where ID = id  

只需使用
UPDATE inv SET state = 2 where state = 0

你不能在一个sintax上两次定义一个表作为目标 但你可以用2桌子做 SELECT num FROM inv WHERE state = 0

  

UPDATE inv_1 SET state = 2 WHERE ID =(来自inv_2 WHERE state = 0的SELECT ID)