如何为现有INSERT INTO SELECT语句添加wa_research表重复数据检查
看起来你想给现有的INSERT查询加个去重逻辑,确保不会往wa_research表插入重复数据对吧?这里有几种常用的方案,你可以根据自己的场景选:
方案1:使用NOT EXISTS子查询(推荐,可读性强)
这种方法直接在WHERE条件里检查待插入的记录是否不存在于wa_research表中。你需要先明确哪些字段组合用来判断记录是否重复(比如是field2单独唯一,还是多个字段的组合),下面以field2作为唯一标识为例:
INSERT INTO wa_research (field1, field2, field3, field4, field5, field6, field7, field8, field9, field10) SELECT A.field1, A.field2, A.field3, A.field4, A.field5, A.field6, A.field7, A.field8, A.field9, A.field10 FROM wa_tmp_listed A LEFT JOIN wa_list B ON A.field2 = B.field2 WHERE -- 原查询的筛选条件(假设是筛选B中不存在的记录) B.field2 IS NULL -- 新增:检查wa_research中不存在相同field2的记录 AND NOT EXISTS ( SELECT 1 FROM wa_research R WHERE R.field2 = A.field2 -- 如果是多字段组合判断重复,就加AND条件,比如: -- AND R.field1 = A.field1 AND R.field3 = A.field3 );
方案2:使用LEFT JOIN + IS NULL
和你原查询的LEFT JOIN逻辑保持一致,把wa_research也左连进来,然后筛选出匹配不到的记录:
INSERT INTO wa_research (field1, field2, field3, field4, field5, field6, field7, field8, field9, field10) SELECT A.field1, A.field2, A.field3, A.field4, A.field5, A.field6, A.field7, A.field8, A.field9, A.field10 FROM wa_tmp_listed A LEFT JOIN wa_list B ON A.field2 = B.field2 LEFT JOIN wa_research R ON A.field2 = R.field2 -- 同样,多字段的话加更多JOIN条件 WHERE B.field2 IS NULL AND R.field2 IS NULL; -- 确保wa_research中没有匹配的记录
方案3:使用INSERT ... ON DUPLICATE KEY UPDATE(需唯一约束)
如果wa_research表已经有唯一约束(比如针对field2创建了UNIQUE索引),可以用这种方法:当待插入的记录已存在时,要么更新字段,要么什么都不做(比如更新一个字段为自身)。
首先创建唯一约束(如果还没有的话):
ALTER TABLE wa_research ADD UNIQUE KEY uk_field2 (field2);
然后修改INSERT语句:
INSERT INTO wa_research (field1, field2, field3, field4, field5, field6, field7, field8, field9, field10) SELECT A.field1, A.field2, A.field3, A.field4, A.field5, A.field6, A.field7, A.field8, A.field9, A.field10 FROM wa_tmp_listed A LEFT JOIN wa_list B ON A.field2 = B.field2 WHERE B.field2 IS NULL ON DUPLICATE KEY UPDATE -- 如果不想更新任何内容,就写一个无意义的赋值,比如: field1 = field1;
注意事项
- 一定要明确重复判断的字段规则,这是所有方案的核心,如果你用多个字段组合来判断重复,记得在所有关联条件里都加上对应的字段。
- 方案1和2在插入前会先过滤掉重复数据,方案3是尝试插入,遇到重复就执行更新(或无操作),适合需要处理重复时更新数据的场景。
内容的提问来源于stack exchange,提问作者BCH
相关产品推荐
相关产品推荐

