如何处理SQL Server中的重复项

时间:2014-04-23 11:11:42

标签: c# sql sql-server duplicates

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

表格如下所示:

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

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

INSERT INTO Test_Table
VALUES (@Id,@Name) 

我从c#代码中传递了这些值。现在我想修改它,以便表没有重复项。我应该在哪里查看,在代码或数据库中?我在DB方面的表现非常薄弱。那么如何在我的表中插入值之前处理重复项

7 个答案:

答案 0 :(得分:2)

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

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.

答案 1 :(得分:2)

"对"这样做的方法是在DB中,因为:

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

如果使用MSSQL,请使用UNIQUE Constraints

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

答案 2 :(得分:2)

如果您不想重复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
}

答案 3 :(得分: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)

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

答案 4 :(得分:1)

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

主要使用哪个,因为人们可能有重复的名称。

答案 5 :(得分:1)

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

试试这样:

alter table Test_Table add primary key (ID)

alter table Test_Table add unique key (Name)

答案 6 :(得分:1)

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