SQL Server:如果不存在则添加行,增加一列的值,原子

ese*_*elk 6 sql sql-server atomic sql-server-2008

我有一个表,用于记录用户操作.每次执行操作时,值都需要增加.由于用户可以同时拥有多个会话,因此该过程需要是原子的,以避免多用户问题.

该表有3列:

  • ActionCodevarchar
  • UserIDint
  • Countint

我想通过ActionCodeUserID到将添加一个新行,如果一个已经不存在,并设置数量为1.如果该行确实存在一个功能,它只是一个增加数量. ActionCodeUserID组成此表的主要唯一索引.

如果我需要做的就是更新,我可以做这样简单的事情(因为UPDATE查询已经是原子的):

UPDATE (Table)
SET Count = Count + 1 
WHERE ActionCode = @ActionCode AND UserID = @UserID
Run Code Online (Sandbox Code Playgroud)

我是SQL新手中的原子事务.这个问题可能已在多个部分得到解答,但我找不到这些问题并将这些部分放在一个解决方案中.这也需要非常快,而不会变得复杂,因为这些操作可能经常发生.

编辑:对不起,这可能是MySQL的一个骗局如何在单个查询中执行if exists增量.我搜索了很多,但tsql在我的搜索中,一旦我改为sql相反,这是最好的结果.如果这是原子的,那不是很明显,但很确定它会是.我可能会投票删除这个作为欺骗,除非有人认为这个问题和答案可以增加一些新的价值.

Ser*_*lov 9

假设您使用的是SQL Server,要创建单个原子语句,您可以使用MERGE

MERGE YourTable AS target
USING (SELECT @ActionCode, @UserID) AS source (ActionCode, UserID)
ON (target.ActionCode = source.ActionCode AND target.UserID = source.UserID)
WHEN MATCHED THEN 
    UPDATE SET [Count] = target.[Count] + 1
WHEN NOT MATCHED THEN   
    INSERT (ActionCode, UserID, [Count])
    VALUES (source.ActionCode, source.UserID, 1)
OUTPUT INSERTED.* INTO #MyTempTable;
Run Code Online (Sandbox Code Playgroud)

更新如果需要,使用输出选择值.代码已更新.