【问题标题】:How can I prevent inserting duplicate data into a SQL Server table?如何防止将重复数据插入 SQL Server 表?
【发布时间】:2012-01-06 18:15:21
【问题描述】:

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

要插入的示例数据:

David  
James  
John  

如果第4个数据又是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,我应该怎么检查数据?

【问题讨论】:

    标签: c# sql sql-server sql-server-2008


    【解决方案1】:

    试试这个简单的方法

      { 
            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)
    {
    }
                        }
    
      }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我同意你不应该单独使用约束/索引来处理重复数据,但是很高兴知道你永远不需要清理数据,因为你已经有了这个约束。我想您可能有兴趣查看 SQL Server 2008 添加的 MERGE 函数,它结合了您的 If Exists Update Else Insert 选项的语法,我相信它们已经提高了效率。 technet.microsoft.com/en-us/library/bb510625.aspx
      • 是的,绝对知道并使用 MERGE 语句。可以修改我的答案以包含一个示例。
      • 感谢您提供如此详细的答案,我现在正在尝试:)
      • @BertEvans 我应该如何运行这个语句?我应该保存在 .sql 文件中然后在 c# 中运行还是有其他方法?
      • @Xuan:你会想在数据库端创建过程,然后从你的c#代码中调用它。
      【解决方案3】:

      如果您想防止重复数据被插入,您可以在这些字段上使用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)
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2021-07-31
          • 1970-01-01
          • 2016-02-19
          • 1970-01-01
          • 2015-08-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-02
          相关资源
          最近更新 更多