我需要将现有值增加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;
答案 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);