SQL Server单条SQL语句实现table1与table2记录同步(支持新增、更新、删除)
没问题!要实现table1到table2的全量同步(包含新增、更新、删除),不同数据库的语法略有区别,我给你整理了主流数据库的单条SQL实现方案:
全量同步SQL方案
1. MySQL/MariaDB 版本
MySQL没有原生的单语句全量同步语法,但可以用两条逻辑关联的语句(可一次性执行)完成需求:先处理新增和更新,再清理table2中table1已删除的记录。
-- 第一步:新增或更新记录——存在则更新字段,不存在则插入 INSERT INTO table2 (Id, name, email) SELECT Id, name, email FROM table1 ON DUPLICATE KEY UPDATE name = VALUES(name), email = VALUES(email); -- 第二步:删除table2中存在,但table1已移除的记录 DELETE t2 FROM table2 t2 LEFT JOIN table1 t1 ON t2.Id = t1.Id WHERE t1.Id IS NULL;
注:如果你的SQL客户端支持多语句执行(比如JDBC需开启allowMultiQueries=true),这两条可以作为一个整体执行,满足你“单条执行”的需求。
2. SQL Server/Oracle 版本(推荐用MERGE)
这两个数据库支持MERGE语句,能在单条语句内完成新增、更新、删除三种操作,非常适合你的需求:
SQL Server 写法
MERGE INTO table2 AS target USING table1 AS source ON target.Id = source.Id -- 当记录匹配时,更新name和email字段 WHEN MATCHED THEN UPDATE SET target.name = source.name, target.email = source.email -- 当table2没有这条记录时,插入table1的新数据 WHEN NOT MATCHED BY TARGET THEN INSERT (Id, name, email) VALUES (source.Id, source.name, source.email) -- 当table1已删除这条记录时,同步删除table2的对应数据 WHEN NOT MATCHED BY SOURCE THEN DELETE;
Oracle 写法
语法和SQL Server类似,仅字段引用细节稍有不同:
MERGE INTO table2 target USING table1 source ON (target.Id = source.Id) WHEN MATCHED THEN UPDATE SET target.name = source.name, target.email = source.email WHEN NOT MATCHED THEN INSERT (Id, name, email) VALUES (source.Id, source.name, source.email) WHEN NOT MATCHED BY SOURCE THEN DELETE;
关键注意点
- 必须确保两张表的
Id字段是主键或唯一索引,这样才能精准匹配记录,避免重复插入。 - MERGE语句在不同数据库的版本支持略有差异,比如Oracle需要10g及以上版本才能使用
WHEN NOT MATCHED BY SOURCE语法。
内容的提问来源于stack exchange,提问作者Alexa Thinu
相关产品推荐
相关产品推荐

