SQL Server 实现 Insert 或 Update 的方法总结
学习笔记作者:admin日期:2025-07-06点击:159
摘要:本文介绍了 SQL Server 中实现类似 MySQL 的 `INSERT OR UPDATE` 功能的几种方法,包括使用 `MERGE` 语句、`IF EXISTS` 判断以及 `TRY/CATCH` 方式。重点推荐使用 `MERGE`,并提供代码示例和注意事项。
SQL Server 实现 Insert 或 Update 的方法总结
1. 使用 MERGE 语句(推荐)
      SQL Server 提供了 MERGE 语句,可以实现“插入或更新”的功能,也被称为 “upsert”。它适用于大多数场景,语法简洁且功能强大。
MERGE INTO YourTable AS target
USING (VALUES (@ID, @Name)) AS source (ID, Name)
ON target.ID = source.ID
WHEN MATCHED THEN
    UPDATE SET target.Name = source.Name
WHEN NOT MATCHED THEN
    INSERT (ID, Name)
    VALUES (source.ID, source.Name);- 说明:
  - YourTable是目标表。
- source是你要插入的数据源。
- ON target.ID = source.ID是匹配条件(例如主键或唯一索引)。
- 如果匹配成功,则执行 UPDATE。
- 如果没有匹配,则执行 INSERT。
 
2. 使用 IF EXISTS + UPDATE / INSERT
这是一种常见的做法,适用于简单的场景。
IF EXISTS (SELECT 1 FROM YourTable WHERE ID = @ID)
BEGIN
    UPDATE YourTable
    SET Name = @Name
    WHERE ID = @ID
END
ELSE
BEGIN
    INSERT INTO YourTable (ID, Name)
    VALUES (@ID, @Name)
END- 说明:
  - 首先检查记录是否存在。
- 如果存在则更新,否则插入。
 
3. 使用 TRY/CATCH 实现先插入再更新
这种方法在高并发环境下容易引发问题,需谨慎使用。
BEGIN TRY
    INSERT INTO YourTable (ID, Name)
    VALUES (@ID, @Name)
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() = 2627 -- 主键冲突错误码
    BEGIN
        UPDATE YourTable
        SET Name = @Name
        WHERE ID = @ID
    END
END CATCH;- 说明:
  - 尝试插入数据,如果因主键冲突失败,捕获异常后改为更新。
- 不建议在高并发下使用,容易出现竞态条件。
 
4. 注意事项
- 主键或唯一约束: 确保用于匹配的字段有主键或唯一约束,否则逻辑可能不安全。
- 并发环境: 在高并发情况下,建议使用事务,并考虑适当的隔离级别以避免竞态条件。
- MERGE 行为: 使用 MERGE时要注意其行为,特别是在处理多个匹配行或触发器时。
5. 总结
| 方法 | 是否推荐 | 说明 | 
|---|---|---|
| MERGE | ✅ 推荐 | 功能强大、简洁,SQL Server 原生支持 upsert。 | 
| IF EXISTS | ✅ 可用 | 简单清晰,适合小数据量和简单逻辑。 | 
| TRY/CATCH插入失败再更新 | ❌ 不推荐 | 容易引发并发问题。 |