在mySQL表inv
中有3列:ID
,num
和state
。
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 =未使用。
希望我能更清楚地表达我的方法。
答案 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)