MySQL批量插入非重复含NULL值数据的实现方案问询
解决MySQL批量插入时将NULL视为重复值的问题
你之前已经搞定了单条插入时把NULL视为重复值的场景,现在要扩展到批量插入,我来给你梳理具体的实现方法。
首先先明确你的场景:你有一张test_duplicate_join表,结构和初始化语句如下:
CREATE TABLE test_duplicate_join ( vendor INT, buyside INT, columnnme VARCHAR(32), mappingid INT , columntype VARCHAR(32) ); ALTER TABLE test_duplicate_join ADD PRIMARY KEY(mappingId); ALTER TABLE test_duplicate_join MODIFY mappingId INT NOT NULL AUTO_INCREMENT; CREATE UNIQUE INDEX idx_name_phone ON test_duplicate_join(vendor,buyside,columnnme,columntype); INSERT INTO test_duplicate_join (vendor,buyside,columntype) VALUES (0,34,'Excel'),(0,35,'A');
你的核心需求是:批量插入数据时,除自增的mappingId外,其余列**完全一致(包括NULL值视为相同)**则判定为重复,只插入不重复的条目。但INSERT IGNORE结合唯一索引的方式在处理NULL时失效,因为MySQL默认不把NULL视为重复值,所以需要用自定义的判断逻辑来实现。
批量插入的实现方案
我们可以利用INSERT ... SELECT语法,结合VALUES()行构造器批量构造待插入的数据,再通过NOT EXISTS子句过滤掉已存在的重复数据,同时处理NULL值的比较逻辑。
假设你要批量插入的数据集是(0,34, 'Excel'),(1,36, 'fd'),可以这样写:
INSERT INTO test_duplicate_join (vendor, buyside, columnnme) SELECT v.vendor, v.buyside, v.columnnme FROM ( -- 这里列出所有要批量插入的行,支持任意数量的条目 VALUES (0, 34, 'Excel'), (1, 36, 'fd') ) AS v(vendor, buyside, columnnme) WHERE NOT EXISTS ( SELECT 1 FROM test_duplicate_join d -- 对每个需要判定重复的字段,处理NULL相等的情况 WHERE (d.vendor = v.vendor OR (d.vendor IS NULL AND v.vendor IS NULL)) AND (d.buyside = v.buyside OR (d.buyside IS NULL AND v.buyside IS NULL)) AND (d.columnnme = v.columnnme OR (d.columnnme IS NULL AND v.columnnme IS NULL)) -- 如果columntype也需要参与重复判定,添加下面的条件 -- AND (d.columntype = v.columntype OR (d.columntype IS NULL AND v.columntype IS NULL)) );
关键逻辑说明
VALUES()构造待插入的临时数据集,给临时表起别名v并指定字段名,方便后续和目标表关联比较。- 在
NOT EXISTS的过滤条件中,每个字段都使用(字段值相等 或者 两者都为NULL)的逻辑,这样就能把NULL值视为相同的重复值,完美匹配你的业务需求。 - 如果需要把
columntype也纳入重复判定,只需要按照同样的格式添加对应的条件即可。
验证效果
执行上述语句后,第一条(0,34, 'Excel')因为和表中已存在的条目完全匹配(包括字段值和NULL的判定),会被过滤掉;第二条(1,36, 'fd')是全新数据,会被正常插入,完全符合你的预期。
内容的提问来源于stack exchange,提问作者prince
相关产品推荐
相关产品推荐

