SQL Server 如何实现insert if not exists跨库去重插入操作
SQL Server跨库按唯一字段去重插入(insert if not exists)实现语法
方案1:使用NOT EXISTS(全版本兼容,推荐)
兼容性最好,适合所有SQL Server版本,逻辑清晰易懂,语法如下:
INSERT INTO [目标数据库名].[dbo].[table2] -- 表结构完全一致时可直接写*,更推荐显式指定字段避免后续表结构变更引发的插入错误 SELECT * FROM [源数据库名].[dbo].[table1] t1 WHERE NOT EXISTS ( SELECT 1 FROM [目标数据库名].[dbo].[table2] t2 WHERE t2.emailid = t1.emailid )
显式指定字段的安全写法参考:
INSERT INTO [目标数据库名].[dbo].[table2] (emailid, 字段2, 字段3, 其他字段...) SELECT t1.emailid, t1.字段2, t1.字段3, t1.其他字段... FROM [源数据库名].[dbo].[table1] t1 WHERE NOT EXISTS ( SELECT 1 FROM [目标数据库名].[dbo].[table2] t2 WHERE t2.emailid = t1.emailid )
方案2:使用MERGE语句(SQL Server 2008及以上版本支持)
适合需要同时处理插入、更新等多场景匹配的需求,仅去重插入的写法如下:
MERGE [目标数据库名].[dbo].[table2] t2 USING [源数据库名].[dbo].[table1] t1 ON t2.emailid = t1.emailid -- 未匹配到相同emailid记录时执行插入 WHEN NOT MATCHED THEN INSERT (emailid, 字段2, 字段3, 其他字段...) VALUES (t1.emailid, t1.字段2, t1.字段3, t1.其他字段...);
注意事项
- 请将示例中的
[源数据库名]、[目标数据库名]替换为实际的数据库名称,如果表的架构不是默认的dbo,需要对应修改为实际架构名。 - 正式执行迁移前,建议先把
INSERT语句改为SELECT验证待插入的数据是否符合预期,避免误操作。 - 大数据量迁移场景下,建议搭配
TOP N+循环分批插入,避免长时间锁表影响业务。
内容的提问来源于stack exchange,提问作者Vinith Kumar
相关产品推荐
相关产品推荐

