Firebird SQL中的原子增量或插入

时间:2018-01-24 15:43:55

标签: sql firebird firebird2.5

我需要将现有值增加N,或者如果密钥不存在则插入N.我正在寻找一个原子命令,但是Merge和Update或Insert不提供这个(增量或插入)。有没有比这个伪代码更好的解决方案

UPDATE T SET T.COL=T.COL+N WHERE KEY=K;
If (nothing updated) INSERT INTO T(KEY,COL) VALUE(K,N);
If (duplicate exception) UPDATE T SET T.COL=T.COL+N WHERE KEY=K;

2 个答案:

答案 0 :(得分:1)

您可以使用merge执行此操作:

merge into mergetest as t
   using (select 1 as id, 2 as countcolumn from rdb$database) as src
       on t.id = src.id
   when matched then 
       update set t.countcolumn = t.countcolumn + src.countcolumn
   when not matched then 
       insert (id, countcolumn) values (src.id, src.countcolumn)

当然,在并发加载下,这可能仍会失败(例如,两个事务插入相同的记录,或者两个事务更新同一记录),因此请准备好重试您的事务。

答案 1 :(得分:0)

这是来自Arioch' The的评论。我很惊讶,但它准备好了。我有空的时候会测试它。每当Arioch发布这个作为答案时,我都会批准这样做,这样他就能获得互联网积分。

UPDATE OR INSERT INTO T(K,C)
VALUES
  (:K,
    COALESCE(
      (SELECT T.C 
       FROM T
       WHERE T.K = :K), 0)   
   + :INCREMENT)
MATCHING (K);