Spr*_*ner 38 sql-server merge upsert
我有一个表测试,其中包含主键和自动递增的列 id 和名称。当且仅当没有记录时,我想插入一条新记录。例如
输入是 id=30122 和 name =john
如果有 ID 为 30122 的记录,那么我将 name 列更新为 john,如果没有记录,那么我将插入一条新记录。
我可以使用 2 个查询,例如
select * from test where id=30122
Run Code Online (Sandbox Code Playgroud)
如果它有一些记录,那么我可以使用 update test set name='john' where id=3012
或者如果它没有记录,那么我可以使用
insert into test(name) values('john')
Run Code Online (Sandbox Code Playgroud)
但我想使用单个查询?
有人可以告诉它是否可能吗?
vij*_*ayp 53
你可以试试这个
IF EXISTS(select * from test where id=30122)
update test set name='john' where id=3012
ELSE
insert into test(name) values('john');
Run Code Online (Sandbox Code Playgroud)
获得更好性能的其他方法是
update test set name='john' where id=3012
IF @@ROWCOUNT=0
insert into test(name) values('john');
Run Code Online (Sandbox Code Playgroud)
Eva*_*kas 19
假设 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)
);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
该SERIALIZABLE提示需要在高并发正确操作。
您可以在此处找到 Michael J. Swart 对常用方法的比较:
| 归档时间: |
|
| 查看次数: |
270630 次 |
| 最近记录: |