如何高效实现从id到uuid的数据库迁移?以charges表为例
高效将charges表的prev_charge_id转换为prev_charge_uuid的方法
我有一张名为charges的表,其中包含外键prev_charge_id。我们已新增prev_charge_id字段,现需将prev_charge_id转换为prev_charge_uuid,寻求高效实现方法。
当前表结构及数据
id name prev_charge_id prev_charge_uuid uuid 1 kv null null abcd-abcd-abcd-abcd 2 Op 1 null qbcd-aqcd-qbcd-qbcd
期望更新结果
id name prev_charge_id prev_charge_uuid uuid 1 kv null null abcd-abcd-abcd-abcd 2 Op 1 abcd-abcd-abcd-abcd qbcd-aqcd-qbcd-qbcd
高效实现方案
自连接批量更新SQL
通过自连接关联表内数据,一次性完成批量更新,避免逐行操作的低效:
MySQL/MariaDB
UPDATE charges t1 JOIN charges t2 ON t1.prev_charge_id = t2.id SET t1.prev_charge_uuid = t2.uuid WHERE t1.prev_charge_id IS NOT NULL;
PostgreSQL
UPDATE charges t1 SET prev_charge_uuid = t2.uuid FROM charges t2 WHERE t1.prev_charge_id = t2.id AND t1.prev_charge_id IS NOT NULL;
性能优化建议
- 确保
id为主键(默认带索引),同时给prev_charge_id添加索引,减少自连接时的全表扫描开销。 - 若表数据量极大,可按
id范围分批次执行更新,避免单次更新锁表时间过长影响业务。
内容的提问来源于stack exchange,提问作者Kunal Vashist
相关产品推荐
相关产品推荐

