我已经编写了一个存储过程,如果记录存在,它将执行更新,否则它将执行插入.它看起来像这样:

update myTable set Col1=@col1, Col2=@col2 where ID=@ID
if @@rowcount = 0
insert into myTable (Col1, Col2) values (@col1, @col2)

以这种方式编写的逻辑是,更新将使用where子句执行隐式 Select ,如果返回0,则将进行插入.

这种方法的替代方法是进行 Select ,然后根据返回的行数进行更新或插入.我认为这是低效的,因为如果要进行更新,它将导致2次 Select (第一次显式 Select 调用,第二次隐式 Select 调用在更新的位置).如果proc进行插入,那么效率就不会有任何差异.

我的逻辑正确吗?

推荐答案

你的假设是对的,这是最好的方法,叫做upsert/merge.

Importance of UPSERT - from sqlservercentral.com:

对于上述 case 中的每个更新,我们都会删除一个

最好的策略是try

Edit:

Sql相关问答推荐

基于模式或其他行集的数据复制

Lag()函数的差异:R与SQL(将R代码转换为SQL)

如何利用单列历史SQLsnowflake获得合并结果

返回找到的最小和最大row_number()spark SQL

在SQL中为两个日期之间的每个日期添加行

Select 列组(按同一表格中的另一列分组)Laravel 10

根据时间、状态和相关行在PostgreSQL中的存在来删除行

根据是否出现过零来筛选数据(跨多行)

Select 最频繁的值以及分组依据

用另一个表中的特定名称替换 SQL 查询中的 ID.但我的两个表都有多个列

AdventureWorks 查询

对于小数据集,EF / SQL 语句花费的时间太长

SQL 查找 varchar 类型列及其值中多次出现的子字符串

标量子查询中的窗口函数不起作用

每组使用平均值来填补缺失值的SQL

带聚合函数的 percentile_cont

连续期间的缺口

Set vs let vs 在snowflake中声明变量

连接表时避免重复

如何根据时间在 MongoDB Compass 中分组?