SQL MERGE 语句将插入、更新和删除操作合并到单个查询中,以将目标表与源表中的数据同步。它通过使用指定的连接条件比较目标表和源表之间的行来工作。根据行是否匹配,MERGE 执行不同的操作:找到匹配项时更新或删除目标表中的现有行,未找到匹配项时插入新行。这消除了对单独的 INSERT、UPDATE 或 DELETE 语句的需求,从而简化了数据同步任务,例如将批量新的或修改的记录加载到生产表中。
典型的 MERGE 语句包括目标表(正在被修改的表)、源(提供输入数据的表、视图或子查询)以及连接两者的连接条件。例如,假设您有一个 Customers
表和一个临时表 CustomerUpdates
。要合并更改,您可以编写
MERGE INTO Customers AS target
USING CustomerUpdates AS source
ON target.CustomerID = source.CustomerID
WHEN MATCHED THEN
UPDATE SET target.Email = source.Email, target.Name = source.Name
WHEN NOT MATCHED THEN
INSERT (CustomerID, Email, Name)
VALUES (source.CustomerID, source.Email, source.Name);
此处,该语句检查 CustomerID
是否存在于两个表中。如果匹配,则更新 Customers
中的电子邮件和姓名;如果不匹配,则插入新行。可选子句,例如 WHEN NOT MATCHED BY SOURCE
(用于目标表中在源中找不到的行),也可以触发删除或其他逻辑。
使用 MERGE 时需要考虑的关键因素包括事务的原子性(所有操作同时成功或失败)和性能。对连接列(例如 CustomerID
)进行适当的索引对于避免全表扫描至关重要。请注意数据库特定的语法差异:SQL Server 和 Oracle 支持 MERGE,而 PostgreSQL 使用 INSERT ... ON CONFLICT
,MySQL 使用 REPLACE
或 ON DUPLICATE KEY UPDATE
。测试边缘情况,例如源表中有多条匹配的行(可能导致错误)或并发环境中的竞态条件。MERGE 非常适合批量操作,但对于大型数据集可能需要锁定策略以防止阻塞。