在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,所以在此期间没有其他人会使用它。后来,当我成功生成一张完美的发票时,我会用状态 = 1(已使用)更新此记录。如果生成发票完美失败,我将状态设置回 0 = 未使用。
希望我能更清楚地表达我的方法。
更新 inv 集状态 = 2,其中 id 在(从 inv 中选择 id,其中 状态 = 0 限制 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;
此查询已使用示例数据进行验证。
试试这个;)
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;
update inv a join (select num from inv where state= 0) b on a.id = b.id
SET state = 2;
这行得通吗?
UPDATE inv SET state = 2 Where ID IN (SELECT id FROM inv WHERE state = 0)