SQL如何实现不存在对应值时向表插入数据,现有语句报错如何解决?
问题原因
- 原SQL中
NOT EXISTS的使用不符合语法要求:NOT EXISTS必须跟随子查询,用于校验目标表中是否存在匹配的记录,不能直接跟判断等式。 - 缺失目标表
table1的关联逻辑:没有指定要和table1的哪条记录做存在性校验。
修正方案
标准通用写法(适配所有支持SQL的数据库)
假设你要判断的规则是:table1中不存在和table2当前行TypeId相等的记录就执行插入,修正后的SQL如下:
INSERT INTO table1 (id, name, value) SELECT t2.Id, t2.Name, t2.Value FROM table2 t2 WHERE NOT EXISTS ( -- 子查询判断table1中是否存在匹配记录 SELECT 1 FROM table1 t1 WHERE t1.typeId = t2.TypeId );
如果你的判断规则是多个字段匹配才算存在(比如id和name都一致才认为记录已存在),只需要调整子查询内的WHERE条件即可,示例:
WHERE t1.id = t2.Id AND t1.name = t2.Name
数据库特有简化写法
如果使用的是MySQL,且table1的校验字段(比如上面的typeId)已经设置了唯一索引,可以用更简洁的INSERT IGNORE实现,冲突时会自动跳过插入:
INSERT IGNORE INTO table1 (id, name, value, typeId) SELECT Id, Name, Value, TypeId FROM table2;
内容的提问来源于stack exchange,提问作者Rich
相关产品推荐
相关产品推荐

