2011-11-26 3 views
5

SQL에 기록해야하는 일련의 데이터가 있는데 SQL에서 데이터를 검사하여 동일한 데이터가 테이블에 삽입되지 않도록해야합니까?중복 데이터를 SQL Server 테이블에 삽입하지 못하게하려면 어떻게해야합니까?

예 데이터가 삽입 될 :

David 
James 
John 

4 데이터가 다시 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) 
{ 
} 

내가 마지막으로 삽입 된 문자열 값 checkname, 내가 데이터를 확인합니까해야 있어요?

답변

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 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

중복 데이터를 원하지 않으면 DB 수준에서 또는 UNIQUE INDEX

을 적용하는 것이 좋습니다. SQL Server 2008에는 MERGE 진술이 있습니다. 일치하는 레코드를 확인하십시오. 기존 레코드를 업데이트하려는 경우 유용 할 수 있습니다.

관련 문제