跨双Schema的DOMAINS表MERGE实现咨询:匹配NAME不操作,新增用旧ID
你的MERGE语句思路完全贴合需求,只需补全语法细节
你的核心逻辑完美匹配业务规则:通过NAME字段匹配新旧表记录,匹配到同名数据就保留新Schema的现有ID不做任何修改,未匹配到的新NAME记录则复用旧Schema的ID插入。不过需要把语句里的占位符和语法补全,以下是修正后的完整版本(以Oracle为例,不同数据库语法略有差异,但核心逻辑一致):
MERGE INTO domains a USING ( SELECT id, name, code, description FROM <Old Schema 6.1>.domains@db_mig_61_to_74 ) b ON (a.name = b.name) WHEN MATCHED THEN DO NOTHING -- 匹配到同名记录,保留新Schema现有数据,不执行任何操作 WHEN NOT MATCHED THEN INSERT (a.id, a.name, a.code, a.description) VALUES (b.id, b.name, b.code, b.description); -- 新记录复用旧Schema的ID插入
关键细节说明:
WHEN MATCHED THEN DO NOTHING:这是符合SQL标准的写法(Oracle 10g及以上支持),明确表示匹配到同名记录时不做任何修改/删除,完全满足你“保留现有ID且不合并”的需求。如果是更低版本的Oracle,也可以用WHEN MATCHED THEN UPDATE SET a.id = a.id(空更新操作)替代,效果一致。VALUES子句完整性:必须把b表的所有对应列填入,确保插入的记录包含完整的NAME、CODE、DESCRIPTION信息,同时严格复用旧表的ID字段。
额外注意事项:
- 确认新Schema的
domains表中ID是否为主键/唯一约束:如果是,要提前校验旧Schema中待插入的ID没有被新Schema里其他不同NAME的记录占用,否则会触发主键冲突错误,这一点需要业务层面提前确认或做数据预检查。 - 若使用的是其他数据库(比如SQL Server),
DO NOTHING的写法会有差异(SQL Server需用WHEN MATCHED THEN UPDATE SET [ID] = [ID]这种空操作),要根据实际数据库类型调整语法。
内容的提问来源于stack exchange,提问作者user2102665
相关产品推荐
相关产品推荐

