2011-11-26 134 views
5

我有一系列需要寫入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) 
{ 
} 

我得到的字符串值檢查名即最後插入的,我應該怎麼做檢查數據?

回答

5

首先,您可以通過使用唯一索引或約束來防止表中出現重複。一個索引/約束可以在的音樂會中使用以下建議。如果您僅使用使用唯一索引而不是以下解決方案之一,那麼插入重複記錄將引發錯誤,您需要在另一端處理該錯誤。

此外,我可能會通過存儲過程插入數據,檢查該行是否已經存在。要做到這一點,你可以使用一個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 
+0

我同意你不應該單獨使用約束/索引來處理重複的數據,但很高興知道你永遠不必清理數據,因爲你已經有了這個約束。我想你可能有興趣查看SQL Server 2008添加的'MERGE'函數,它結合了「If Exists Update Else Insert」選項的語法,我相信它們使它更高效。 http://technet.microsoft.com/en-us/library/bb510625.aspx –

+0

是的,肯定知道並使用MERGE語句。可以修改我的答案以包含示例。 – Bert

+0

感謝您給出這樣的詳細答案,我現在試圖:) – KayX

2

如果您想要阻止重複的數據被插入,您可以在這些字段上使用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) 
6

如果你不想要重複的數據,你應該考慮在數據庫級執行一個UNIQUE CONSTRAINTUNIQUE INDEX

SQL Server 2008還有一個MERGE聲明你可以用來檢查匹配的記錄。如果您想更新現有記錄,這可能會有所幫助。

相關問題