2011-11-26 139 views
5

我有一系列需要写入SQL的数据,我该如何检查SQL中的数据以防止将相同的数据插入到表中?要插入如何防止将重复数据插入到SQL Server表中?

示例数据:

David 
James 
John 

如果第四数据John再次,我希望系统跳过重复记录(约翰)。

到目前为止,我有:

SqlConnection myCnn = new SqlConnection(cnn); 
String _state = "Insert into CamNo1(platename, date, camID, path, filename) OUTPUT INSERTED.platename values(@msg, getdate(), @camID, @path, @filename)"; 
SqlCommand _Query = new SqlCommand(_state, myCnn); 

_Query.Parameters.AddWithValue("@msg", msg); 
_Query.Parameters.AddWithValue("@camID", camID); 
_Query.Parameters.AddWithValue("@path", imageFile); 
_Query.Parameters.AddWithValue("@filename", name); 

try 
{ 
    myCnn.Open(); 
    string checkname = (string)_Query.ExecuteScalar(); 
    myCnn.Close(); 

    getcheckname = checkname; 
    Console.WriteLine("OK"); 
} 
catch (Exception) 
{ 
} 

我得到的字符串值检查名即最后插入的,我应该怎么做检查数据?

回答

5

首先,您可以通过使用唯一索引或约束来防止表中出现重复。一个索引/约束可以在的音乐会中使用以下建议。如果您仅使用使用唯一索引而不是以下解决方案之一,那么插入重复记录将引发错误,您需要在另一端处理该错误。

此外,我可能会通过存储过程插入数据,检查该行是否已经存在。要做到这一点,你可以使用一个MERGE声明,如本伪代码:

create procedure MyProcedure 
(
    @Name nvarchar(100), 
    ... 
) 
as 

merge MyTable 
using 
(
    select @Name,... 
) as source (Name, ...) 
on MyTable.Name = source.Name 
when not matched then 
    insert (Name,...) values (source.Name,...) 
when matched then 
    update set Name = @Name,... 

或者,你可以检查的记录存在,然后插入或手动更新:

create procedure MyProcedure 
(
    @Name nvarchar(100), 
    ... 
) 
as 

    if not exists (select * from MyTable where Name = @Name) 
    begin 
     insert into MyTable (Name,...) values (@Name,...) 
    end 
    else 
    begin 
      update MyTable 
      set ... 
      where Name = @Name 
    end 
+0

我同意你不应该单独使用约束/索引来处理重复的数据,但很高兴知道你永远不必清理数据,因为你已经有了这个约束。我想你可能有兴趣查看SQL Server 2008添加的'MERGE'函数,它结合了“If Exists Update Else Insert”选项的语法,我相信它们使它更高效。 http://technet.microsoft.com/en-us/library/bb510625.aspx –

+0

是的,肯定知道并使用MERGE语句。可以修改我的答案以包含示例。 – Bert

+0

感谢您给出这样的详细答案,我现在试图:) – KayX

2

如果您想要阻止重复的数据被插入,您可以在这些字段上使用unique index or unique constraint

如果你只想运行一个硬插入语句,但是如果存在一个值就不会做任何事情,像这样的东西应该可以工作。我在本地数据库上对此进行了测试:

declare @subject as varchar(100); 
set @subject = 'hello' 

insert into Subjects ([name]) 
select @subject 
where not exists (select 1 from Subjects where [name] = @Subject) 
6

如果你不想要重复的数据,你应该考虑在数据库级执行一个UNIQUE CONSTRAINTUNIQUE INDEX

SQL Server 2008还有一个MERGE声明你可以用来检查匹配的记录。如果您想更新现有记录,这可能会有所帮助。

相关问题