如何防止将重复数据插入SQL Server表?

Kay*_*ayX 5 c# sql sql-server sql-server-2008

我有一系列需要写入SQL的数据,我应该怎么做才能检查SQL中的数据以防止相同的数据插入到表中?

要插入的示例数据:

David  
James  
John  
Run Code Online (Sandbox Code Playgroud)

如果第四个数据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)
{
}
Run Code Online (Sandbox Code Playgroud)

我得到了最后插入的字符串值checkname,我应该检查数据?

Ada*_*ger 6

如果您不想要重复数据,则应考虑使用UNIQUE CONSTRAINTUNIQUE INDEX在DB级别强制执行该操作

SQL Server 2008还有一个MERGE语句,可用于检查匹配的记录.如果要更新现有记录,这可能会有所帮助.


Ber*_*ert 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,...
Run Code Online (Sandbox Code Playgroud)

或者,您可以检查记录是否存在并手动插入或更新:

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
Run Code Online (Sandbox Code Playgroud)