Tôi có nhìn thấy mọi người có vấn đề về mẫu thiết kế với logic này.
1 - Kiểm tra sự tồn tại của bản ghi.
2 - Nếu nó không tồn tại, hãy chèn bản ghi.
Đặc biệt nếu đồng thời có hiệu lực. Tùy thuộc vào mức độ cách ly, bạn có thể có dữ liệu trùng lặp hoặc vi phạm chính.
Tại sao không đặt khóa chính trên pname và pnumber ở địa điểm đầu tiên. Tôi giả sử bạn đang nói về một bảng người.
Ví dụ của tôi.
--
-- Setup sample table w/data
--
-- Sample table
create table #person
(
person_id int identity (1, 1),
person_name varchar(64) not null,
person_no varchar(16) not null
);
go
-- primary key
alter table #person
add primary key (person_no, person_name)
go
-- first insert works
insert into #person (person_name, person_no) values ('bilbo', 123)
go
Chìa khóa để giải pháp là bẫy vi phạm chính khóa. Bỏ qua lỗi này có thể là tốt hay xấu tùy thuộc vào logic nghiệp vụ của bạn.
Tôi quyết định bỏ qua vấn đề.
--
-- Ignore primary key violations
--
-- Try these steps
BEGIN TRY
-- Second insert fails
insert into #person (person_name, person_no) values ('bilbo', 123)
END TRY
-- Error Handler
BEGIN CATCH
-- Ignore PK error
IF ERROR_NUMBER() <> 2627
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
Giải pháp này loại bỏ các mục trùng lặp và không báo cáo vi phạm PK.
Nguồn
2013-10-10 17:52:54
Mục đích của kiểm tra này là gì? Nếu bạn đang kiểm tra tính duy nhất, một chỉ mục duy nhất trên các cột đơn giản hơn – podiluska