WordPress MySQL数据库:如何为10000个post_id批量插入postmeta记录?
批量为WooCommerce商品插入品牌信息的正确MySQL语句
问题背景
需要为约10000个商品/变体的post_id插入品牌记录,格式为(post_id, '_wc_gla_brand', 'TheYayAtelier'),但之前的SQL操作要么插入大量重复记录,要么报错。
正确SQL语句
基础版本(确保每个post_id仅插入一条)
INSERT INTO `Ug77XZe58_postmeta` (post_id, meta_key, meta_value) SELECT DISTINCT post_id, '_wc_gla_brand', 'TheYayAtelier' FROM `Ug77XZe58_postmeta` WHERE meta_key LIKE "%_wc_gla_sync_status%";
或者使用GROUP BY实现去重:
INSERT INTO `Ug77XZe58_postmeta` (post_id, meta_key, meta_value) SELECT post_id, '_wc_gla_brand', 'TheYayAtelier' FROM `Ug77XZe58_postmeta` WHERE meta_key LIKE "%_wc_gla_sync_status%" GROUP BY post_id;
进阶版本(避免重复插入已存在品牌的记录)
如果要防止对已经设置过品牌的post_id重复插入,可以用左连接过滤:
INSERT INTO `Ug77XZe58_postmeta` (post_id, meta_key, meta_value) SELECT DISTINCT pm.post_id, '_wc_gla_brand', 'TheYayAtelier' FROM `Ug77XZe58_postmeta` pm LEFT JOIN `Ug77XZe58_postmeta` pm_brand ON pm.post_id = pm_brand.post_id AND pm_brand.meta_key = '_wc_gla_brand' WHERE pm.meta_key LIKE "%_wc_gla_sync_status%" AND pm_brand.post_id IS NULL;
错误原因分析
第一个SQL插入290000条记录的原因:
外层查询FROM Ug77XZe58_postmeta会取出所有匹配post_id IN (...)的记录——同一个post_id可能对应多条不同的meta_key记录,导致每个post_id被重复插入多次,最终总记录数远超预期。第二个SQL报错的原因:
子查询SELECT post_id WHERE meta_key LIKE "%_wc_gla_sync_status%"返回了多行结果,但VALUES中的子查询只能返回单行数据,因此触发报错,且该写法本身只能插入一条记录,无法满足批量操作需求。
内容的提问来源于stack exchange,提问作者Astar Wstar
相关产品推荐
相关产品推荐

