如何通过MySQL批量修改WordPress wp_postmeta表meta_key并添加序号
WordPress wp_postmeta 画廊meta_key批量加序号MySQL解决方案
前置操作
- 务必先全量备份
wp_postmeta表,避免操作失误导致数据丢失,备份命令参考:
CREATE TABLE wp_postmeta_bak AS SELECT * FROM wp_postmeta;
- 请将下方SQL中的
原画廊meta_key替换为你实际需要修改的画廊类meta_key原值,比如你原来的所有画廊图片对应的meta_key是fave_property_images就直接替换即可。
方案1:MySQL 8.0 / MariaDB 10.2 及以上版本(支持窗口函数,性能最优)
使用窗口函数给每个post_id下的目标meta行生成自增序号,直接更新meta_key:
UPDATE wp_postmeta pm INNER JOIN ( SELECT meta_id, ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY meta_id) AS img_num FROM wp_postmeta WHERE meta_key = '原画廊meta_key' ) t ON pm.meta_id = t.meta_id SET pm.meta_key = CONCAT('fave_property_images_', t.img_num);
说明:ORDER BY meta_id是按数据插入顺序排序生成序号,如果你需要按其他规则排序,比如按meta_value里的图片上传时间,可以自行修改ORDER BY后的字段。
方案2:MySQL 5.x 版本(无窗口函数兼容方案)
用用户变量实现分组序号生成:
UPDATE wp_postmeta pm INNER JOIN ( SELECT meta_id, @num := IF(@current_post = post_id, @num + 1, 1) AS img_num, @current_post := post_id FROM wp_postmeta WHERE meta_key = '原画廊meta_key' ORDER BY post_id, meta_id ) t ON pm.meta_id = t.meta_id CROSS JOIN (SELECT @num := 0, @current_post := 0) AS vars SET pm.meta_key = CONCAT('fave_property_images_', t.img_num);
结果校验
更新完成后可以执行以下SQL抽查结果是否符合预期:
SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE meta_key LIKE 'fave_property_images_%' ORDER BY post_id, meta_key LIMIT 20;
如果发现操作错误,可以直接从备份表恢复数据:
TRUNCATE TABLE wp_postmeta; INSERT INTO wp_postmeta SELECT * FROM wp_postmeta_bak;
内容的提问来源于stack exchange,提问作者Sabry Suleiman
相关产品推荐
相关产品推荐

