在SQL中减少或删除

时间:2009-08-12 23:16:52

标签: sql

在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,那么只需完全删除记录”?我可以想到更长的方法,但没有像上面那样简洁。

3 个答案:

答案 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;