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

本文关键字:插入 数据 何防止 SQL Server | 更新日期: 2023-09-27 18:15:52

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

要插入的示例数据:

David  
James  
John  

如果第4个数据又是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)
{
}

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

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

首先,可以通过使用唯一索引或约束来防止表中出现重复。索引/约束可以与以下建议协同工作。如果您只使用唯一索引,而不是下面的解决方案之一,插入重复记录将抛出错误,您需要在另一端处理。

此外,我可能会通过一个存储过程插入数据,该存储过程检查该行是否已经存在。为此,可以使用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

如果您不想要重复的数据,您应该考虑在数据库级别使用UNIQUE约束或UNIQUE INDEX

来强制执行。

SQL Server 2008也有一个MERGE语句,你可以用它来检查匹配的记录。如果您想要更新现有记录,这可能会很有帮助。

如果您希望防止重复数据被插入,您可以在这些字段上使用唯一索引或唯一约束。

如果您只想运行硬插入语句,但如果存在值,则不做任何操作,那么像这样的操作应该可以工作。我在本地数据库上进行了测试,我有:

declare @subject as varchar(100);
set @subject = 'hello'
insert into Subjects ([name]) 
select @subject 
where not exists (select 1 from Subjects where [name] = @Subject)

试试这个简单的方法

  { 
        DataSet ds = New DataSet();
SqlConnection myCnn = New SqlConnection(cnn);
myCnn.Open();
                    SqlCommand _Query = New SqlCommand("Select *FROM CamNo1 where platename='" + Console.ReadLine + "' ", myCnn);
                  SqlDataAdapter  sda = New SqlDataAdapter(_Query);
                    sda.Fill(ds);
                    Int i = ds.Tables[0].Rows.Count;
                    If (i > 0) Then
                                {
                        MessageBox.Show("platename" + Console.WriteLine + "Already Exists ");
                        ds.Clear();
                    }
                    Else
                    {
                        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", i`enter code here`mageFile`);
_Query.Parameters.AddWithValue("@filename", Name);
Try
{
   myCnn.Open();
   String checkname = (String)_Query.ExecuteScalar();
   myCnn.Close();
   getcheckname = checkname;
   Console.WriteLine("OK");
}
Catch (Exception)
{
}
                    }
  }