在SQL中,我有一个映射token => count的表;它是一个默认值为0的字典。如果我想增加一个令牌,我可以说:
insert into my_table (token, count)
values (my_token, 1)
on duplicate key update count = count + 1;
如果令牌尚不存在,则插入count = 1。漂亮的。
在SQL中是否有类似的简单方法来执行相反的操作,即“给定一个令牌,减少其计数,如果计数变为0,那么只需完全删除记录”?我可以想到更长的方法,但没有像上面那样简洁。
答案 0 :(得分:2)
我的建议是使用如下交易(我的SQL有点生疏,但你应该明白这一点):
-- begin transaction
update my_table set count = count - 1 where id = '7'
delete from my_table where id = '7' and count = 0
commit
这将确保减量和删除操作的原子性。
但是,您可能需要考虑的另一种可能性 - 不要在它达到零时删除它。因为你说默认值无论如何都是零,只需将行保留在那里,值为0。
当然,您的查询需要进行更改才能适应。如果您有一个列出活动令牌,它将从:
更改select token from my_table
为:
select token from my_table where count > 0
在这种情况下,递减SQL必须小心,不要将令牌数量降低到-1,因此它将成为:
update my_table set count = count - 1 where id = '7' and count > 0
在缩减时简化了SQL。如果您仍然希望那些零计数的行消失,您可以使用另一个定期运行的进程来扫描它们:
delete from my_table where count = 0
这只是一些需要考虑的选择 - 如果你真的希望它们在计数到零的确切时间消失,那么使用上面的交易方法。
答案 1 :(得分:0)
你想要触发器。 (我认为这是MS SQL)。
答案 2 :(得分:0)
insert into my_table (token, count)
values (my_token, 0)
on duplicate key update count = count - 1;