MySQL如何为满足多条件的post_id批量插入新行?
批量插入符合条件的记录解决方案
核心实现SQL
直接使用INSERT ... SELECT语句批量处理,一次完成符合条件的记录插入,避免循环操作带来的性能损耗:
-- 替换成你的实际表名 INSERT INTO your_table_name (post_id, meta_key, meta_value) SELECT post_id, 'banner', 'my new banner' FROM your_table_name t1 WHERE t1.meta_key = 'page-type' AND t1.meta_value = 'city' AND NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.post_id = t1.post_id AND t2.meta_key = 'banner' ) GROUP BY post_id; -- 确保同一个post_id只插入一条记录
性能优化建议(针对20万级数据)
添加联合索引:
为post_id和meta_key创建联合索引,大幅提升查询和子查询的效率:CREATE INDEX idx_post_meta ON your_table_name(post_id, meta_key);分批次插入(可选):
如果直接批量插入导致锁表或性能下降,可先将符合条件的post_id存入临时表,再分批次插入:-- 创建临时表存储目标post_id CREATE TEMPORARY TABLE temp_target_posts AS SELECT DISTINCT post_id FROM your_table_name t1 WHERE t1.meta_key = 'page-type' AND t1.meta_value = 'city' AND NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.post_id = t1.post_id AND t2.meta_key = 'banner' ); -- 每次插入1000条,调整偏移量直到完成 INSERT INTO your_table_name (post_id, meta_key, meta_value) SELECT post_id, 'banner', 'my new banner' FROM temp_target_posts LIMIT 0, 1000;
验证插入结果
执行以下SQL确认所有符合条件的post_id都已插入banner记录:
SELECT t1.post_id FROM your_table_name t1 WHERE t1.meta_key = 'page-type' AND t1.meta_value = 'city' AND NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.post_id = t1.post_id AND t2.meta_key = 'banner' );
若查询结果为空,说明插入全部完成。
内容的提问来源于stack exchange,提问作者Champion
相关产品推荐
相关产品推荐

