原子SQL操作:不确定方法(根据现有数据插入/更新)

时间:2011-09-04 21:02:51

标签: sql sql-server

表格包含以下内容:

   ID: 4 
 DATE: 040910 
COUNT: 42

如果表格中已存在ID和DATE,请将计数增加1。 如果特定ID和DATE尚不存在,请使用计数1创建。 “ID”不是唯一的 - 只要日期代码发生变化,它就可能在表格中重复出现。

每次我想到一个解决方案,它似乎都会引发竞争条件。我想过BEGIN / END交易,但这似乎也不是100%可靠。我不能只是插入,如果它失败然后更新,除非我将ID字段合并到DATE并使其成为一个唯一的列。

想法?

编辑:我刚才想到了这个:

INSERT INTO table (...) VALUES (...)
WHERE NOT EXISTS (SELECT 1 FROM table WHERE table.id == x AND table.date == y)

UPDATE table SET count = count + 1 WHERE table.id == x AND table.date == y

所以总是执行更新,但插入取决于表的当前值,但我担心仍有2条记录可能出现相同的id&日期。

1 个答案:

答案 0 :(得分:2)

交易有什么问题?除非SQL Server中存在错误,否则它们将按照描述的方式工作。您还可以设置交易的ISOLATION LEVEL以满足您的需求。

BEGIN TRANSACTION;

UPDATE YourTable
   SET Count = Count + 1
 WHERE ID = X AND Date = Y;

IF @@rowcount = 0
    INSERT INTO YourTable (ID, Date, Count)
    VALUES (X, Y, 1);

COMMIT TRANSACTION;

您还应该对两列都有唯一约束(即:UNIQUE(ID, DATE)