我在SQL Server中有一个名为Test_Table
的表,其中有两列:ID
和Name
表格如下所示:
ID NAME
--------
1 John
2 Jane
现在我有一个存储过程可以将记录插入其中。
INSERT INTO Test_Table
VALUES (@Id,@Name)
我从c#代码中传递了这些值。现在我想修改它,以便表没有重复项。我应该在哪里查看,在代码或数据库中?我在DB方面的表现非常薄弱。那么如何在我的表中插入值之前处理重复项
答案 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中,因为:
如果使用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