phpMyAdmin下MySQL根据关联表字段批量更新表B多行A_id值
MySQL表结构调整+数据迁移方案(phpMyAdmin环境适用)
操作前请先备份表B,数千行数据量级备份耗时极短,可避免误操作导致的数据丢失
操作全程可以直接在phpMyAdmin的SQL执行页跑语句,按顺序执行即可:
- 先给表B新增int类型的A_id字段
不要一开始就删除原有A_name字段,先留着旧字段做数据兜底:
新字段先设置为允许NULL,避免更新阶段因为非空约束报错。ALTER TABLE `表B` ADD COLUMN `A_id` INT NULL COMMENT '关联表A主键';- 先给表B新增int类型的A_id字段
- 执行关联更新,匹配表A的A_id值写入新字段
用多表关联UPDATE的写法,性能远高于子查询,数千行数据可以秒级执行完成:
UPDATE `表B` INNER JOIN `表A` ON `表B`.`A_name` = `表A`.`A_name` SET `表B`.`A_id` = `表A`.`A_id`;特殊情况处理:如果表B里存在表A中没有对应A_name的脏数据,这部分行的A_id会保持NULL值。跑完更新后可以执行下面的语句捞出异常数据单独处理:
SELECT * FROM `表B` WHERE `A_id` IS NULL;- 执行关联更新,匹配表A的A_id值写入新字段
- 数据校验
先确认数据匹配率符合预期,再进行后续操作:
确认所有有效数据都正确关联后,可以按需给A_id字段加非空约束、外键约束:SELECT COUNT(*) AS 表B总行数, COUNT(`A_id`) AS 成功匹配A_id的行数 FROM `表B`;-- 确认无NULL值后再执行非空约束修改 ALTER TABLE `表B` MODIFY COLUMN `A_id` INT NOT NULL COMMENT '关联表A主键'; -- 按需添加外键约束 ALTER TABLE `表B` ADD CONSTRAINT `fk_b_aid` FOREIGN KEY (`A_id`) REFERENCES `表A`(`A_id`);- 数据校验
- 删除旧字段
反复核对数据无误后,再删除表B原有的varchar类型A_name字段,完成结构调整:
ALTER TABLE `表B` DROP COLUMN `A_name`;- 删除旧字段
内容的提问来源于stack exchange,提问作者bmeritorious
相关产品推荐
相关产品推荐

