兰州市网站建设_网站建设公司_JSON_seo优化
2025/12/30 11:01:25 网站建设 项目流程

主流数据库MERGE支持(匹配则更新,反之插入)语法示例和对比,具体如下:

1.oracle

1.1语法介绍

MERGE INTO 目标表 别名
USING 源表/子查询 别名
ON (匹配条件)
WHEN MATCHED THEN  -- 匹配成功:执行更新UPDATE SET 字段=WHEN NOT MATCHED THEN  -- 匹配失败:执行插入INSERT (字段列表) VALUES (值列表)

1.2示例介绍

MERGE INTO sec_org o
USING (SELECT * FROM sync_org WHERE is_sync = 1 AND tenant_code = 'TENANT001'  -- 替换为实际租户编码
) so
ON (o.org_id = so.org_id)
WHEN MATCHED THENUPDATE SET o.parent_org_id = so.parent_org_id,o.org_name      = NVL(so.org_short_name, so.org_name),o.org_type      = so.org_type,o.org_wbs_code  = so.org_wbs_code,o.org_wbs_level = so.org_wbs_level,o.orderby       = so.orderby,o.status        = so.status,o.update_time   = SYSDATE  -- 建议用当前时间而非源表update_time
WHEN NOT MATCHED THENINSERT (org_id, parent_org_id, org_name, org_type,org_wbs_code, org_wbs_level, orderby, status,remark, create_time, update_time, tenant_code) VALUES (so.org_id, so.parent_org_id, NVL(so.org_short_name, so.org_name),so.org_type, so.org_wbs_code, so.org_wbs_level, so.orderby,so.status, so.remark, SYSDATE, SYSDATE, so.tenant_code);
COMMIT;  -- Oracle 11.2 需手动提交(若不在事务中)

2.mssql

2.1语法介绍

MERGE [ INTO ] 目标表 [ 目标别名 ]
USING 源表/子查询 [ 源别名 ]
ON (匹配条件)
[ WHEN MATCHED [ AND 额外条件 ] THEN UPDATE SET 字段=值 ]
[ WHEN NOT MATCHED [ AND 额外条件 ] THEN INSERT (字段列表) VALUES (值列表) ]
[ OUTPUT 输出字段 ];  -- MSSQL 独有,Oracle 11.2 不支持

2.2示例介绍

MERGE INTO sec_org o  -- 目标表
USING (SELECT * FROM sync_org WHERE is_sync = 1 AND (tenant_code = @tenantCode OR @tenantCode IS NULL)  -- 替代动态条件
) so  -- 源表(子查询)
ON (o.org_id = so.org_id)  -- 匹配条件
WHEN MATCHED THEN  -- 匹配成功:更新UPDATE SET o.parent_org_id = so.parent_org_id,o.org_name = ISNULL(so.org_short_name, so.org_name),  -- MSSQL 用 ISNULL 替代 NVLo.org_type = so.org_type,o.org_wbs_code = so.org_wbs_code,o.org_wbs_level = so.org_wbs_level,o.orderby = so.orderby,o.status = so.status,o.update_time = so.update_time
WHEN NOT MATCHED THEN  -- 匹配失败:插入INSERT (org_id, parent_org_id, org_name, org_type,org_wbs_code, org_wbs_level, orderby, status,remark, create_time, update_time, tenant_code)VALUES (so.org_id, so.parent_org_id, ISNULL(so.org_short_name, so.org_name),so.org_type, so.org_wbs_code, so.org_wbs_level, so.orderby,so.status, so.remark, so.update_time, so.update_time, so.tenant_code);

SQL Server 2008+ 引入了 MERGE 语句,语法和 Oracle 高度相似

  1. 函数替换:Oracle 的 NVL → MSSQL 的 ISNULL(功能完全一致);
  2. 动态条件:MSSQL 用变量 @tenantCode 替代 ${tenantCode},通过 OR @tenantCode IS NULL 实现 “可选过滤”;
  3. 版本兼容:SQL Server 2008+ 支持完整 MERGE,2005 及以下需用 UPDATE + INSERT 分开写;
  4. 原子性:MSSQL 的 MERGE 是原子操作,可加 OUTPUT 子句返回受影响的行(Oracle 11.2 不支持)。

3.mysql

3.1语法介绍

INSERT INTO 目标表 (字段列表)
SELECT 源字段列表 FROM 源表 WHERE 过滤条件
[ ON DUPLICATE KEY UPDATE 字段1=值1, 字段2=值2, ... ];

3.2示例介绍

MySQL 没有 MERGE INTO 关键字,但提供了更灵活的「替换 / 插入」语法,核心有 2 种实现方式:
方案 1:INSERT ... ON DUPLICATE KEY UPDATE(推荐,高效)
-- 方案1
INSERT
INTO sec_org (org_id, parent_org_id, org_name, org_type,org_wbs_code, org_wbs_level, orderby, status,remark, create_time, update_time, tenant_code ) SELECT org_id, parent_org_id, IFNULL(org_short_name, org_name), -- MySQL 用 IFNULL 替代 NVL org_type, org_wbs_code, org_wbs_level, orderby, status,remark, update_time, update_time, tenant_code FROM sync_org WHERE is_sync = 1 AND (tenant_code = #{tenantCode} OR #{tenantCode} IS NULL) -- 动态条件 ON DUPLICATE KEY UPDATE -- 匹配到唯一键(org_id)时执行更新parent_org_id = VALUES(parent_org_id), -- VALUES(字段) 引用插入的源值org_name = VALUES(org_name),org_type = VALUES(org_type),org_wbs_code = VALUES(org_wbs_code),org_wbs_level = VALUES(org_wbs_level),orderby = VALUES(orderby),status = VALUES(status),update_time = VALUES(update_time);
核心逻辑:匹配唯一键时更新,不匹配时插入
 
方案2:
REPLACE INTO sec_org (org_id, parent_org_id, org_name, org_type,org_wbs_code, org_wbs_level, orderby, status,remark, create_time, update_time, tenant_code
)
SELECT org_id, parent_org_id, IFNULL(org_short_name, org_name),org_type, org_wbs_code, org_wbs_level, orderby, status,remark, update_time, update_time, tenant_code
FROM sync_org 
WHERE is_sync = 1 AND (tenant_code = #{tenantCode} OR #{tenantCode} IS NULL);

核心逻辑:匹配唯一键时先删除旧行,再插入新行

 

核心前提:目标表 sec_org 的 org_id 字段必须是「主键」或「唯一索引」(否则失效)。
  1. 函数替换:Oracle NVL → MySQL IFNULL(或 COALESCE);
  2. 唯一键要求:两种方案都依赖 org_id 是主键 / 唯一索引,否则退化为普通插入(会报主键冲突);
  3. 动态条件:MySQL 中 ${tenantCode} 直接嵌入即可,或用 IF(tenantCode IS NULL, 1=1, tenant_code = #{tenantCode})
  4. 版本兼容:INSERT ... ON DUPLICATE KEY UPDATE 从 MySQL 4.1 开始支持,无版本风险
 

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询