У меня есть таблица "INSERTIF", которая выглядит так:
id value
S1 s1rocks
S2 s2rocks
S3 s3rocks
Прежде чем вставлять строку в эту таблицу, мне нужно проверить, существует ли данный идентификатор. Если он не существует, тогда вставьте. Else, просто обновите значение. Я хочу сделать это безопасным потоком. Можете ли вы сказать, правильно ли мой код или нет? Я попробовал, и это сработало. Но я хочу быть уверенным, что у меня нет недостатка в производительности.
EDIT 1 - Я хочу использовать этот код для вставки миллионов строк по одному. Каждый оператор insert обернут вокруг кода, который я показал.
EDIT 2 - Я не хочу использовать часть UPDATE для моего кода, достаточно только вставки.
Я НЕ хочу использовать MERGE, потому что он работает только с SQL Server 2008 и выше
Спасибо.
Код -
-- no check insert
INSERT INTO INSERTIF(ID,VALUE)
VALUES('S1', 's1doesNOTrock')
--insert with checking
begin tran /* default read committed isolation level is fine */
if not exists
(select * from INSERTIF with (updlock, rowlock, holdlock)
where ID = 'S1')
BEGIN
INSERT INTO INSERTIF(ID,VALUE)
VALUES('S1', 's1doesNOTrock')
END
else
/* update */
UPDATE INSERTIF
SET VALUE = 's1doesNOTrock'
WHERE ID = 'S1'
commit /* locks are released here */
Код для создания таблицы -
CREATE TABLE [dbo].[INSERTIF](
[id] [varchar](50) NULL,
[value] [varchar](50) NULL
)
INSERT [dbo].[INSERTIF] ([id], [value]) VALUES (N'S1', N's1rocks')
INSERT [dbo].[INSERTIF] ([id], [value]) VALUES (N'S2', N's2rocks')
INSERT [dbo].[INSERTIF] ([id], [value]) VALUES (N'S3', N's3rocks')