【问题标题】:How to handle duplicates in SQL Server如何处理 SQL Server 中的重复项
【发布时间】:2014-06-08 04:22:27
【问题描述】:

我在 SQL Server 中有一个名为 Test_Table 的表,其中包含两列:IDName

表格如下所示:

ID NAME
--------   
1  John
2  Jane

现在我有一个将记录插入其中的存储过程。

INSERT INTO Test_Table
VALUES (@Id,@Name) 

我正在从我的 c# 代码中传递这些值。现在我想修改它,使表没有重复。我应该在哪里检查这个,在代码或数据库中?我在数据库方面的东西很弱。那么在我的表中插入值之前如何处理重复项

【问题讨论】:

  • 您可以在任何地方进行操作。我认为你应该在 sql 中做。你应该做@m hasan 解决方案。
  • 使用唯一键约束修改 ID 字段可能会解决您的问题。

标签: c# sql sql-server duplicates


【解决方案1】:

这样做的“正确”方法是在 DB 中,因为:

  • 不需要读取所有数据库
  • 需要将所有数据传递给 C#,这会增加 IO
  • 并发 - 如果您有超过 1 个 C# 应用程序,您将需要同步它们,而在 DB 中会更简单
  • 您可以将列定义为唯一或键,这将防止重复值,DB 会处理它

如果您使用 MSSQL,请使用 UNIQUE Constraints

阅读this关于避免重复的好答案

【讨论】:

    【解决方案2】:

    您应该在数据库中执行此检查。总是,如果你希望它是真实的数据。

    我不确定你认为什么是重复的。通常,id 列将是一个标识列,它会为每个值自动递增。这将防止重复。您可以将其定义为:

    create table test_table (
        id int not null identity(1, 1),
        . . . 
    

    然后,您将使用以下方法插入它:

    insert into test_table(name)
        values (@Name);
    

    id 将被自动分配。

    如果您只希望name 不重复,则创建唯一索引或唯一约束(实际上是相同的东西)。您只需在列中添加unique 即可在表定义中执行此操作:

    create table test_table (
        id int not null identity(1, 1),
        name varchar(255) unique
        . . .
    

    或者在创建表后创建唯一索引:

    create index test_table_name on test_table(name)
    

    (或者通过显式创建约束,这是另一种方法。)

    【讨论】:

      【解决方案3】:

      在任何一种情况下,您都必须访问数据库以检查值是否已经存在。

      IF NOT EXISTS (SELECT * FROM Test_Table WHERE ID= @ID AND Name=@Name)
          BEGIN
              INSERT INTO Test_Table
              VALUES (@Id,@Name) 
          END
      

      如果可以将 ID 列设为唯一,则可以避免检查,因为重复 ID 值不允许插入,在这种情况下,您将不得不处理错误。

      看这个帖子如何处理violation of Unique key constraint.

      【讨论】:

        【解决方案4】:

        如果您不想重复 ID,则必须将 ID 设置为主键,这几乎是强制性的。

        如果您不希望名称重复,您可以使用表中包含的名称填充一个列表,然后您只需插入该列表中没有的任何名称。

        这是一个例子,我没有使用列表,而是使用了字典:

        Dictionary<int, string> Names = new Dictionary<int, string> ();
        using (SqlCommand command = new SqlCommand ("SELECT * FROM TestTable", con))
        using (SqlDataReader reader = command.ExecuteReader ()) {
           while (reader.Read ()) {
              Names.Add (reader["ID"], reader["NAME"]);
           }
        }
        
        if (!Names.ContainsValue ("ValueYouWantToInsert")) {
           //do stuff
        }
        

        【讨论】:

          【解决方案5】:

          您应该在数据库中检查它,也可以将 ID 设为Primary Key

          这是最常用的,因为人们可以有重复的名字。

          【讨论】:

            【解决方案6】:

            您可以使用 唯一键 约束修改您的 ID,也可以将其设为 主键

            试试这样:

            alter table Test_Table add primary key (ID)
            

            alter table Test_Table add unique key (Name)
            

            【讨论】:

              【解决方案7】:
              IF NOT EXISTS (SELECT * FROM Test_Table WHERE ID= @ID AND Name=@Name)
                  BEGIN
                      INSERT INTO Test_Table
                      VALUES (@Id,@Name) 
                  END
                  ELSE
                  BEGIN
                      UPDATE Test_Table
                      SET ID= @ID,NAME = @Name
                      WHERE ID= @ID AND Name=@Name
                  END
              

              【讨论】:

                猜你喜欢
                • 2014-05-29
                • 1970-01-01
                • 2010-09-06
                • 2015-05-13
                • 1970-01-01
                • 2021-06-11
                • 2017-03-17
                • 2019-04-22
                • 2016-07-05
                相关资源
                最近更新 更多