繁体   English   中英

如何在SQL Server中处理重复项

[英]How to handle duplicates in SQL Server

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

该表如下所示:

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

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

INSERT INTO Test_Table
VALUES (@Id,@Name) 

我正在通过我的C#代码传递此值。 现在,我想对此进行修改,以便该表没有重复项。 在代码或数据库中应在哪里检查? 我在数据库方面非常虚弱。 因此,如何在表中插入值之前处理重复项

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

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

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

请参阅此线程如何处理违反唯一键约束的情况。

执行此操作的“正确”方法是在DB中,因为:

  • 不需要读取所有数据库
  • 需要将所有数据传递到C#,这会增加IO
  • 并发性-如果您有多个C#应用程序,则需要与在数据库中进行同步,这将更加简单
  • 您可以将列定义为唯一或键,这将防止重复的值,数据库会处理

如果使用MSSQL,请使用UNIQUE约束

阅读这个关于避免重复很好的答案

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

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

我不确定您认为该重复什么。 通常, 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)

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

您应该在数据库中检查它,也可以将ID作为主键

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

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

尝试这样:

alter table Test_Table add primary key (ID)

alter table Test_Table add unique key (Name)
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM