所以我一直在使用这种方法将记录插入我的数据库:
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
但我没有遇到过如何实现这一目标的任何例子。我可以通过创建一个存储过程来实现这一点,但我想尝试使用这种方法来实现。
答案 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(不确定它是否存在)以确定重复。