跨数据库更新WordPress用户注册日期遇子查询多行问题求助
解决SQL错误1242 - Subquery returns more than 1 row的问题
你的问题核心在于子查询没有和当前要更新的wp_users行建立关联,导致它一次性返回了所有匹配_member_id的注册日期,而每个user_registered字段只能接受单个值,数据库自然抛出了这个错误。
正确的解决方案有两种,推荐优先用第一种(性能更优):
方法1:使用UPDATE JOIN(推荐)
通过JOIN直接关联三个表,明确每个用户对应的旧注册日期,这种方式在数据量大时效率更高:
UPDATE `new_wp`.`wp_users` u INNER JOIN `new_wp`.`wp_usermeta` um ON u.ID = um.user_id AND um.meta_key = '_member_id' INNER JOIN `old_script`.`members` m ON m.member_id = um.meta_value SET u.user_registered = m.added;
INNER JOIN确保只更新那些在wp_usermeta里有_member_id记录、且旧库members表中存在对应数据的用户;- 如果需要更新所有用户(包括无关联记录的,会被设为NULL),可以把
INNER JOIN换成LEFT JOIN,但通常不建议这么做。
方法2:修正子查询,添加关联条件
如果你更习惯用子查询写法,可以给子查询加上和外层wp_users的关联逻辑,确保每个用户只拿到自己对应的日期:
UPDATE `new_wp`.`wp_users` u SET `user_registered` = ( SELECT m.`added` FROM `old_script`.`members` m JOIN `new_wp`.`wp_usermeta` um ON m.member_id = um.meta_value WHERE um.meta_key = '_member_id' AND um.user_id = u.ID -- 关键:关联当前更新的用户ID,确保子查询只返回单个值 ) -- 可选:只更新有_member_id关联的用户,避免无关联用户被设为NULL WHERE EXISTS ( SELECT 1 FROM `new_wp`.`wp_usermeta` um WHERE um.meta_key = '_member_id' AND um.user_id = u.ID );
额外注意事项:
- 备份数据:执行更新前一定要备份
new_wp数据库,避免操作失误导致数据丢失; - 日期格式检查:确保旧库
members.added的格式和WordPresswp_users.user_registered的datetime格式一致(比如YYYY-MM-DD HH:MM:SS)。如果格式不匹配,可以用STR_TO_DATE()函数转换,例如:SET u.user_registered = STR_TO_DATE(m.added, '%Y/%m/%d %H:%i:%s')(根据实际格式调整参数); - 唯一性检查:确认
wp_usermeta中每个user_id对应唯一的_member_id,如果同一个用户有多个_member_id记录,需要先清理数据,否则JOIN会导致重复更新(可能出现不可预期的结果)。
内容的提问来源于stack exchange,提问作者tinyCoder
相关产品推荐
相关产品推荐

