You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 21:07:42