2014-04-23 54 views
1

我在SQL Server中的表称为Test_Table有两列:IDName在SQL Server中如何处理重复

表看起来是这样的:

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

现在我有一个存储过程它将记录插入到此中。

INSERT INTO Test_Table 
VALUES (@Id,@Name) 

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

+0

你可以在需要的地方做到这一点。在我看来,你应该在SQL中做。你应该做@m hasan解决方案。 –

+0

使用唯一密钥约束修改ID字段可能会解决您的问题。 – Jaihind

回答

2

“正确” 的方式做到这一点是因为DB:

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

如果你使用MSSQL使用UNIQUE Constraints

阅读this约忌很好的答案复制

2

无论哪种情况,您都必须访问数据库以检查是否已有值。

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

如果有可能使ID列作为唯一可以避开检查作为插入would.t被允许重复的ID值,在这种情况下,你将不得不处理错误。

看到这个线程如何处理violation of Unique key constraint.

1

您应该检查它在DB,也可以使ID作为Primary Key

其中大部分是使用,因为人们可以有重复的名字。

1

您可以使用唯一键约束来修改您的ID,或者您也可以使其成为主键

尝试这样的:

alter table Test_Table add primary key (ID) 

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

你应该做此项检查在数据库中。总是,如果你想它是真实的数据。

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

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

然后,你会使用插入它:

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

id将被自动分配。

如果你不想仅仅为name重复,那么创建一个唯一的索引或唯一的约束(真的是一回事)。

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

,或者通过创建唯一索引您已经创建表后:通过显式地创建一个约束

create index test_table_name on test_table(name) 

(或者你可以通过添加unique到列为此在表的定义,这是另一种方法。)

1
IF NOT EXISTS (SELECT * FROM Test_Table WHERE ID= @ID AND [email protected]) 
    BEGIN 
     INSERT INTO Test_Table 
     VALUES (@Id,@Name) 
    END 
    ELSE 
    BEGIN 
     UPDATE Test_Table 
     SET ID= @ID,NAME = @Name 
     WHERE ID= @ID AND [email protected] 
    END