SQL Server插入时避免Customer与Part两列组合值重复的实现方案问询
批量插入联合唯一约束表跳过重复行实现方案
前提确认
首先保证目标表已创建cpmcust+cpmpart的联合唯一约束,语句如下:
ALTER TABLE cpmatrix ADD UNIQUE KEY uk_cust_part (cpmcust, cpmpart);
全数据库通用实现方案
兼容所有主流关系型数据库,同时解决源表自身重复、目标表已有重复两类问题:
INSERT INTO cpmatrix (cpmcust, cpmpart) SELECT DISTINCT customer, part FROM table_2 t2 WHERE NOT EXISTS ( SELECT 1 FROM cpmatrix c WHERE c.cpmcust = t2.customer AND c.cpmpart = t2.part );
逻辑说明:
- 用
DISTINCT先对源表table_2的客户+部件组合去重,避免源表自身的重复数据触发唯一约束报错 - 用
NOT EXISTS校验目标表中不存在相同的组合,仅插入新的组合记录
各数据库原生简化方案
如果使用特定数据库,可以用更简洁的原生语法实现,性能也更优:
MySQL 方案
INSERT IGNORE INTO cpmatrix (cpmcust, cpmpart) SELECT customer, part FROM table_2;
注意:INSERT IGNORE会忽略所有插入错误,不止唯一约束冲突,生产环境使用需谨慎
PostgreSQL 方案
INSERT INTO cpmatrix (cpmcust, cpmpart) SELECT customer, part FROM table_2 ON CONFLICT (cpmcust, cpmpart) DO NOTHING;
仅跳过联合唯一约束冲突的行,不会忽略其他类型错误,更安全
SQL Server 方案
MERGE INTO cpmatrix c USING table_2 t2 ON c.cpmcust = t2.customer AND c.cpmpart = t2.part WHEN NOT MATCHED THEN INSERT (cpmcust, cpmpart) VALUES (t2.customer, t2.part);
常见失败原因说明
之前使用NOT EXISTS/NOT IN未成功,90%以上是因为没有对源表先做去重处理:源表自身存在多条相同的客户+部件组合,就算过滤了目标表已有的记录,源表内部的重复记录插入时依然会触发唯一约束报错。
内容的提问来源于stack exchange,提问作者eddie_head01
相关产品推荐
相关产品推荐

