Sql-Server
如何使用單個查詢插入或更新?
我有一個表測試,其中列 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 對常用方法的比較: