2011-11-26 88 views
5

Tôi có một loạt dữ liệu cần phải được viết vào SQL, tôi nên làm gì để kiểm tra dữ liệu trong SQL để ngăn chặn cùng một dữ liệu được chèn vào bảng?Làm cách nào để ngăn chặn chèn dữ liệu trùng lặp vào bảng SQL Server?

dữ liệu Ví dụ được chèn vào:

David 
James 
John 

Nếu dữ liệu thứ 4 là John lần nữa, tôi muốn hệ thống để bỏ qua kỷ lục trùng lặp (John).

Cho đến nay tôi có:

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) 
{ 
} 

tôi đã nhận chuỗi giá trị checkname được chèn cuối cùng, những gì nên tôi kiểm tra dữ liệu?

Trả lời

5

Trước tiên, bạn có thể ngăn không cho bản sao xuất hiện trong bảng bằng cách sử dụng chỉ mục hoặc ràng buộc duy nhất. Chỉ mục/ràng buộc có thể hoạt động trong buổi hòa nhạc với các đề xuất bên dưới. Nếu bạn chỉ sử dụng chỉ mục duy nhất và không phải một trong các giải pháp dưới đây, việc chèn bản ghi trùng lặp sẽ phát ra lỗi và bạn sẽ cần phải xử lý điều đó ở đầu bên kia.

Ngoài ra, tôi có thể chèn dữ liệu thông qua quy trình được lưu trữ để kiểm tra xem hàng đã tồn tại chưa. Để làm điều đó, bạn có thể sử dụng một tuyên bố MERGE, như thể hiện trong mã giả này:

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

hay, bạn có thể kiểm tra sự tồn tại hồ sơ và chèn hoặc cập nhật bằng tay:

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

Tôi đồng ý rằng bạn không nên sử dụng ràng buộc/chỉ mục một mình để đối phó với dữ liệu trùng lặp, nhưng thật tuyệt khi biết bạn sẽ không bao giờ phải vệ sinh dữ liệu vì bạn có ràng buộc đó. Tôi nghĩ rằng bạn có thể quan tâm để xem xét chức năng 'MERGE' mà SQL Server 2008 đã thêm vào, nó kết hợp cú pháp cho tùy chọn của bạn là' Nếu tồn tại Cập nhật khác Chèn' và tôi tin rằng chúng đã làm cho nó hiệu quả hơn. http://technet.microsoft.com/en-us/library/bb510625.aspx –

+0

Đúng, chắc chắn biết và sử dụng câu lệnh MERGE. Có thể sửa đổi câu trả lời của tôi để bao gồm một ví dụ. – Bert

+0

Cảm ơn bạn đã đưa ra câu trả lời chi tiết như vậy, tôi đang cố gắng ngay bây giờ :) – KayX

2

Nếu bạn muốn ngăn không cho nhập dữ liệu trùng lặp, bạn có thể sử dụng unique index or unique constraint trên các trường đó.

Nếu bạn chỉ muốn chạy một câu lệnh chèn cứng, nhưng nó không làm gì nếu một giá trị tồn tại, một cái gì đó như thế này sẽ làm việc. Tôi đã thử nghiệm điều này trên cơ sở dữ liệu cục bộ mà tôi có:

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

Nếu bạn không muốn dữ liệu trùng lặp, bạn nên xem xét thực thi điều đó ở cấp DB bằng UNIQUE CONSTRAINT hoặc UNIQUE INDEX

SQL Server 2008 cũng có tuyên bố MERGE mà bạn có thể sử dụng để kiểm tra hồ sơ phù hợp. Điều này có thể hữu ích nếu bạn muốn cập nhật bản ghi hiện có.

Các vấn đề liên quan