首页 > 数据库 >SQL Server中Upsert的三种方式(转载)

SQL Server中Upsert的三种方式(转载)

时间:2024-07-15 21:18:20浏览次数:19  
标签:Value Server MERGE SQL table upsert Id Upsert

本文介绍了SQL Server中Upsert的三种常见写法以及他们的性能比较。
SQL Server并不支持原生的Upsert语句,通常使用组合语句实现upsert功能。

 

假设有表table_A,各字段如下所示:

int型Id为主键。

 

方法1:先查询,根据查询结果判断使用insert或者update

IF EXISTS (SELECT 1 FROM table_A WHERE Id = @Id)
    BEGIN
        UPDATE dbo.table_A
        SET Value = @Value
        WHERE Id = @Id;
    END
ELSE
    BEGIN
        INSERT INTO dbo.table_A (Id, Value)
        VALUES(@Id, @Value)
    END

 

方法2:先更新,根据更新结果影响的条目数判断是否需要插入

UPDATE dbo.table_A
SET Value = @Value
WHERE Id = @Id;
    
IF(@@ROWCOUNT = 0)
BEGIN
    INSERT INTO dbo.table_A (Id, Value)
    VALUES(@Id, @Value)
END

 

方法3:使用MERGE语句,将待upsert的数据作为source,merge到目标表 

MERGE INTO table_A as T
USING (SELECT @Id AS id, @Value AS value ) AS S
ON T.Id = S.id
WHEN MATCHED THEN
    UPDATE SET T.Value = S.value
WHEN NOT MATCHED THEN
    INSERT(Id, Value) VALUES(S.id, S.value);

 

性能比较
在50万行数据项中随机upsert10万次

 

场景一:upsert数据项100%命中update

 

 

场景二:upsert数据项100%命中insert

 

场景三:upsert数据项Id为随机数,~50%insert,~50%update

 

从图中可以看出实验数据存在部分偏差,大体上这三种方法在性能上的差别非常小。对于绝大多数upsert并非关键路径的程序,方法2在可读性和执行性能上综合来讲是较优的方案。
在对性能苛求的场景,可以选用MERGE语句,以下是MERGE语句的优点:”
Faster performance. The Engine needs to parse, compile, and execute only one query instead of three (and no temporary variable to hold the key).
Neater and simpler T-SQL code (after you get proficient in MERGE).
No need for explicit BEGIN TRANSACTION/COMMIT. MERGE is a single statement and is executed in one implicit transaction.
Greater functionality. MERGE can delete rows that are not matched by source (SRC table above). For example, we can delete row 1 from A_Table because its Data column does not match Search_Col in the SRC table. There is also a way to return inserted/deleted values using the OUTPUT clause.“

关于SQL Server的Merge介绍可以查看这里

 

原文链接

 

标签:Value,Server,MERGE,SQL,table,upsert,Id,Upsert
From: https://www.cnblogs.com/OpenCoder/p/18303994

相关文章

  • 什么是SQL锁
     SQL锁是数据库系统中的一个重要概念,主要用于保证多用户环境下的数据库完整性和一致性。在多用户并发访问数据库时,通过加锁的方式防止其他事务访问指定的资源,从而控制并发的访问,确保数据的完整性和一致性。 SQL锁可以分为以下几种类型:1、行锁行锁是指在事务执行期间,仅对......
  • MySQL增量备份
    增备1做增量备份前,是需要进行一次完成备份的1、做数据修改创建一个add1.t1t1包含:id,name加2条数据id|name|+----+------+|1|add1||2|add2|+----+------+操作如下:MySQLroot@(none):(none)>showdatabases;+--------------------+|Database......
  • MySQL差异备份
    只需准备第一次和最后一次即可1、清理之前的备份内容rm-rf/data/backup/*2、进行完整备份#mkdir-p/data/backup/#xtrabackup--defaults-file=/etc/my.cnf--backup--target-dir=/data/backup/base/-uroot-pLixinyi@123-Hlocalhost-P3306--no-ser......
  • SQLCoder部署和应用
    主页个人微信公众号:密码应用技术实战个人博客园首页:https://www.cnblogs.com/informatics/SQLCoder简介SQLCoder是一个用于生成SQL语句的工具,可以通过输入自然语言描述的需求,生成对应的SQL语句。SQLCoder支持连接数据库,对生成的SQL语句可以直接自动执行,并以图表的形式展示结......
  • SQL查询语句汇总
    SQL查询语句汇总 students表idclass_idnamegenderscore11小明M9021小红F95    class表idname1一班2二班3三班4四班      1.基本查询--查询students表的所有数据SELECT*FROMstudents; 使......
  • 数据库-SQL_duckdb向量化计算-vector
    duckdbDuckDB0.10.0引入了新的数据类型ArrayArray不同于Postgres的数组类型(Postgres的是可变长度的),DuckDB的Array列存储固定大小的数组目前相似度计算支持单精度浮点数(4字节)DuckDB的FLOAT4=numpy.float3目前vss功能还有待丰富--持续关注Vector向......
  • MySQL时间戳转成日期格式
    将时间戳转换为日期格式:--如果时间戳为毫秒级长度为13位,需要先除以1000SELECTid,`task_name`,FROM_UNIXTIME(`task_register_begin_time`/1000,'%Y-%m-%d%H:%i:%s')astask_register_begin_time,FROM_UNIXTIME(`task_register_end_time`/1000,'%Y-%m-%d%H:%i:%s')ast......
  • 基于Java+ Java Swing Mysql 实现的学生宿舍管理系统设计与实现
    一、前言介绍:1.1项目摘要随着高校招生规模的不断扩大,学生宿舍管理面临着越来越多的挑战。传统的学生宿舍管理方式往往依赖于人工记录、纸质档案和口头通知,这种方式不仅效率低下,而且容易出错,给宿舍管理带来了诸多不便。因此,开发一套高效、便捷、准确的学生宿舍管理系统成......
  • 基于Java+Ssm+Mysql实现的Java Web酒店管理项目系统设计与实现
    一、前言介绍:1.1项目摘要随着信息技术的快速发展和互联网的普及,传统酒店行业面临着转型升级的压力。为了提高酒店的经营管理水平,提升客户体验,酒店管理系统应运而生。酒店管理系统通过整合酒店内部资源,实现信息的快速传递和处理,为酒店提供了高效、便捷的管理手段。课题“......
  • Day1_1--通过jdbc驱动程序连接mysql数据库+测试(hamcrest+junit)
    idea项目导入mysql对应版本jar包驱动File->ProjectStructure->Libraries点击加号添加驱动并Apply参考代码importorg.junit.Test;importjava.sql.*;/***@authornanzhi*@date2024/7/159:52*/publicclassk1_jdbc{publicstaticvoidmain(String[]ar......