MySQL中使用INSERT INTO...SELECT时如何额外插入指定行数据?
解决方案:用
UNION ALL拼接额外行 要实现这个需求很简单,你可以通过UNION ALL把原本的查询结果和你想要额外插入的那一行数据拼接起来,这样就能在同一条INSERT INTO...SELECT语句里完成所有插入操作了。
具体SQL代码示例
INSERT INTO `post_users_map` (`post_id`, `user_id`, `is_owner`) -- 原有的查询逻辑,获取用户A/B/C的映射关系 SELECT '12345', `user_id`, '0' FROM `users` WHERE username IN ("A","B","C") -- 用UNION ALL拼接你想要额外插入的那一行 UNION ALL SELECT '12345', '123', '1';
为什么用UNION ALL而不是UNION?
UNION会自动对结果集去重,而我们这里需要保留所有目标行(包括可能存在重复的情况),UNION ALL不会做去重检查,执行效率更高。- 必须保证
UNION ALL两边的结果集列数一致、数据类型匹配,否则会报错。比如如果is_owner是整数类型,就不要加引号,直接写1和0即可。
额外优化:自动获取刚插入的post_id
如果你的post_id是插入到table_1后生成的自增ID,不用手动硬写'12345',可以用293975来自动获取刚生成的ID,这样代码更健壮,避免手动输入出错:
-- 第一步:向table_1插入帖子,获取自增post_id INSERT INTO `table_1` (post_title, post_content, ...) VALUES ('你的帖子标题', '帖子内容', ...); -- 把刚生成的post_id存入变量 SET @new_post_id = 293975; -- 第二步:插入映射关系,包含原查询结果和额外行 INSERT INTO `post_users_map` (`post_id`, `user_id`, `is_owner`) SELECT @new_post_id, `user_id`, 0 FROM `users` WHERE username IN ("A","B","C") UNION ALL SELECT @new_post_id, '123', 1;
内容的提问来源于stack exchange,提问作者Saikumar Anireddy
相关产品推荐
相关产品推荐

