Sql-Server

如何使用單個查詢插入或更新?

  • August 21, 2019

我有一個表測試,其中列 id 主鍵和自動遞增和名稱。當且僅當沒有記錄時,我才想插入新記錄。例如

輸入是 id=30122 和 name =john

如果有 id 為 30122 的記錄,那麼我將 name 列更新為 john,如果沒有記錄,那麼我將插入一條新記錄。

我可以使用 2 個查詢,例如

select * from test where id=30122

如果它有一些記錄,那麼我可以使用update test set name='john' where id=3012

或者如果它沒有記錄,那麼我可以使用

insert into test(name) values('john')

但我想使用單個查詢?

有人可以告訴它是否可能嗎?

你可以試試這個

IF EXISTS(select * from test where id=30122)
  update test set name='john' where id=3012
ELSE
  insert into test(name) values('john');

其他獲得更好性能的方法是

update test set name='john' where id=3012
IF @@ROWCOUNT=0
  insert into test(name) values('john');

閱讀這個壞習慣來踢模式前綴

假設 SQL Server 2008 或更高版本,您可以使用MERGE

桌子

CREATE TABLE dbo.Test
(
   id integer NOT NULL,
   name varchar(30) NULL,

   CONSTRAINT PK_dbo_Test__id
       PRIMARY KEY CLUSTERED (id)
);

詢問

MERGE dbo.Test WITH (SERIALIZABLE) AS T
USING (VALUES (3012, 'john')) AS U (id, name)
   ON U.id = T.id
WHEN MATCHED THEN 
   UPDATE SET T.name = U.name
WHEN NOT MATCHED THEN
   INSERT (id, name) 
   VALUES (U.id, U.name);

高並發下正確操作需要SERIALIZABLE提示。

您可以在此處找到 Michael J. Swart 對常用方法的比較:

神話破滅:並發更新/插入解決方案

引用自:https://dba.stackexchange.com/questions/89696