小巧的插入,检查是否存在记录

时间:2014-03-31 11:30:06

标签: c# dapper

所以我一直在使用这种方法将记录插入我的数据库:

TransactionBlock.Connection.Execute(
                            "INSERT Table(Item,Id)VALUES(@Item, @Id);
                            new {Item,Id = id }, TransactionBlock.Transaction);

我现在需要修改它,首先使用以下内容检查Item / id是否已经在数据库中:

const sql =“IF EXISTS(SELECT * FROM Table,where Item = @ Item ... etc etc

但我没有遇到过如何实现这一目标的任何例子。我可以通过创建一个存储过程来实现这一点,但我想尝试使用这种方法来实现。

3 个答案:

答案 0 :(得分:6)

假设您正在使用SQL Server并且您只想插入记录(如果它尚未存在)您要查找的SQL是

IF NOT EXISTS (SELECT * FROM Table WHERE Id = @Id) 
    INSERT INTO Table(Item, Id) VALUES(@Item, @Id)

答案 1 :(得分:4)

INSERT INTO TableName (Item, ID)
SELECT @Item, @Id WHERE NOT EXISTS ( SELECT 1 FROM TableName WHERE Id=@Id )

这将适用于单一声明。

值得注意的是,取决于底层的DBMS,您可能仍然存在争用 - 如果没有发出锁定并且同时发生许多插入,则最终可能会在执行选择时记录不存在的情况下结束,但在它尝试插入之前就已经完成了。

如果您正在处理插件快速发生的情况,我建议您熟悉以下内容:

http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx

祝你好运!

答案 2 :(得分:1)

不是在插入之前检查它是否存在,为什么不使用try / catch时钟来执行插入并捕获DuplicateKeyException(不确定它是否存在)以确定重复。