使用INSERT INTO结合SELECT DISTINCT批量插入数据的SQL问题求助
正确实现批量插入的SQL写法
我来帮你搞定这个批量插入的问题!你之前的几次尝试都因为语法错误或者结果集不匹配的问题没达到预期,咱们来梳理一下问题并给出正确的写法:
你之前尝试的问题分析
- 第一种写法把
VALUES和SELECT的语法混用了,VALUES后需直接跟行数据,不能直接拼接SELECT语句,导致语法报错。 - 第二种写法里的子查询
(SELECT DISTINCT id FROM creature WHERE map = 389)会返回多个ID值,但VALUES只能接受单个值,所以会触发“子查询返回多于一行”的错误。 - 第三种用变量
@id的方式,变量只能存储单个值,所以最终只能插入一行数据,无法实现批量插入的需求。
正确的批量插入SQL
你需要使用INSERT INTO ... SELECT的语法,直接把查询结果(每个唯一ID加上固定字段值)批量插入到目标表中,写法如下:
-- 推荐指定目标表的列名,避免表结构变动导致的问题 INSERT INTO creature_loot_template ( id, item, ChanceOrQuestChance, groupid, mincountOrRef, maxcount, condition_id, comments, lootmode, extended ) SELECT DISTINCT id, 68910, 0, 100, 1, 1, 0, 1, 1, NULL FROM creature WHERE map = 389;
说明:
- 我给目标表的列名起了更易懂的别名(你可以替换成实际表的列名),指定列名的好处是即使目标表的列顺序变化,插入也不会出错,可读性也更强。
SELECT语句会自动将每个map=389的唯一id和你指定的固定字段值组合成一行数据,然后一次性插入到creature_loot_template表中,效果和你预期的多行INSERT完全一致,但效率更高。- 如果你的目标表列顺序和
SELECT返回的列顺序完全一致,也可以省略列名,但强烈建议指定列名,这是更规范的写法。
执行这条语句后,就会自动为每个符合条件的creature.id生成对应的插入行,完全满足你的批量插入需求。
内容的提问来源于stack exchange,提问作者Jada Developer
相关产品推荐
相关产品推荐

