如何防止将重复数据插入到SQL Server表中?
问题描述:
我有一系列需要写入SQL的数据,我该如何检查SQL中的数据以防止将相同的数据插入到表中?要插入如何防止将重复数据插入到SQL Server表中?
示例数据:
David
James
John
如果第四数据John
再次,我希望系统跳过重复记录(约翰)。
到目前为止,我有:
SqlConnection myCnn = new SqlConnection(cnn);
String _state = "Insert into CamNo1(platename, date, camID, path, filename) OUTPUT INSERTED.platename values(@msg, getdate(), @camID, @path, @filename)";
SqlCommand _Query = new SqlCommand(_state, myCnn);
_Query.Parameters.AddWithValue("@msg", msg);
_Query.Parameters.AddWithValue("@camID", camID);
_Query.Parameters.AddWithValue("@path", imageFile);
_Query.Parameters.AddWithValue("@filename", name);
try
{
myCnn.Open();
string checkname = (string)_Query.ExecuteScalar();
myCnn.Close();
getcheckname = checkname;
Console.WriteLine("OK");
}
catch (Exception)
{
}
我得到的字符串值检查名即最后插入的,我应该怎么做检查数据?
答
首先,您可以通过使用唯一索引或约束来防止表中出现重复。一个索引/约束可以在的音乐会中使用以下建议。如果您仅使用使用唯一索引而不是以下解决方案之一,那么插入重复记录将引发错误,您需要在另一端处理该错误。
此外,我可能会通过存储过程插入数据,检查该行是否已经存在。要做到这一点,你可以使用一个MERGE声明,如本伪代码:
create procedure MyProcedure
(
@Name nvarchar(100),
...
)
as
merge MyTable
using
(
select @Name,...
) as source (Name, ...)
on MyTable.Name = source.Name
when not matched then
insert (Name,...) values (source.Name,...)
when matched then
update set Name = @Name,...
或者,你可以检查的记录存在,然后插入或手动更新:
create procedure MyProcedure
(
@Name nvarchar(100),
...
)
as
if not exists (select * from MyTable where Name = @Name)
begin
insert into MyTable (Name,...) values (@Name,...)
end
else
begin
update MyTable
set ...
where Name = @Name
end
答
如果您想要阻止重复的数据被插入,您可以在这些字段上使用unique index or unique constraint。
如果你只想运行一个硬插入语句,但是如果存在一个值就不会做任何事情,像这样的东西应该可以工作。我在本地数据库上对此进行了测试:
declare @subject as varchar(100);
set @subject = 'hello'
insert into Subjects ([name])
select @subject
where not exists (select 1 from Subjects where [name] = @Subject)
答
如果你不想要重复的数据,你应该考虑在数据库级执行一个UNIQUE CONSTRAINT或UNIQUE INDEX
SQL Server 2008还有一个MERGE声明你可以用来检查匹配的记录。如果您想更新现有记录,这可能会有所帮助。
我同意你不应该单独使用约束/索引来处理重复的数据,但很高兴知道你永远不必清理数据,因为你已经有了这个约束。我想你可能有兴趣查看SQL Server 2008添加的'MERGE'函数,它结合了“If Exists Update Else Insert”选项的语法,我相信它们使它更高效。 http://technet.microsoft.com/en-us/library/bb510625.aspx –
是的,肯定知道并使用MERGE语句。可以修改我的答案以包含示例。 – Bert
感谢您给出这样的详细答案,我现在试图:) – KayX