代码之家  ›  专栏  ›  技术社区  ›  Ken

在SQL中减少或删除

sql
  •  2
  • Ken  · 技术社区  · 16 年前

    在SQL中,我有一个表映射token=>count;它是默认值为0的dict。如果我想增加一个令牌,我可以说:

    insert into my_table (token, count)
    values (my_token, 1)
    on duplicate key update count = count + 1;
    

    如果令牌还不存在,则插入count=1。Nifty。

    在SQL中,是否有一种类似的简单方法来做相反的事情,即“给定一个令牌,减少其计数,如果计数变为0,那么只需完全删除记录”?我可以想出更长的方法来完成它,但没有比上面更简洁的了。

    3 回复  |  直到 16 年前
        1
  •  2
  •   paxdiablo    16 年前

    我的建议是使用如下事务(我的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
    

    这只是需要考虑的一些替代方法——如果您真的希望它们在其计数达到零时消失,那么使用上面的事务方法。

        2
  •  0
  •   Noon Silk    16 年前

    你需要触发器。(我想这是SQL女士)。

        3
  •  0
  •   Greg Ricardo Gellman    16 年前

    嗯,答案是否显而易见:

    insert into my_table (token, count)
    values (my_token, 0) 
    on duplicate key update count = count - 1;