我有看到的人有這個邏輯的設計模式問題。
1 - 測試是否存在記錄。
2 - 如果不存在,請插入記錄。
特別是如果併發發揮作用。根據隔離級別,您可能會有重複的數據或關鍵違規。
爲什麼不把主鍵放在pname和pnumber上。我假設你正在談論一個人桌。
我的例子。
--
-- 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
解決方案的關鍵是捕獲主鍵違規。根據您的業務邏輯,忽略此錯誤可能是好的還是壞的。
我決定忽略這個問題。
--
-- 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
該解決方案消除重複條目,不報告PK違規。
此檢查的目的是什麼?如果您正在檢查唯一性,列上的唯一索引更簡單 – podiluska