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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:45:03