如何通过单条查询基于其他表的值更新列?表结构迁移需求
解决方案:字段迁移与表删除步骤
没问题,这就帮你完成从personshallow表迁移字段到person表,最终删除personshallow表的操作,分四步走,稳得很:
1. 同步entity_ptr_id字段数据
首先把personshallow表中的entity_ptr_id值,根据关联关系同步到person表的对应字段里。因为person.personshallow_ptr_id是外键,关联的就是personshallow.entity_ptr_id(后者是主键),所以直接用带JOIN的UPDATE语句即可:
UPDATE person SET entity_ptr_id = personshallow.entity_ptr_id FROM personshallow WHERE person.personshallow_ptr_id = personshallow.entity_ptr_id;
2. 验证数据同步结果
操作完第一步后,一定要先验证数据是否正确,避免后续出错。比如可以检查person表中有没有entity_ptr_id为空的记录(正常应该是0条,因为每个person都对应一个personshallow):
SELECT COUNT(*) FROM person WHERE entity_ptr_id IS NULL;
也可以对比关联数据是否一致,确保没有匹配错误:
SELECT p.personshallow_ptr_id, p.entity_ptr_id, ps.entity_ptr_id FROM person p JOIN personshallow ps ON p.personshallow_ptr_id = ps.entity_ptr_id WHERE p.entity_ptr_id != ps.entity_ptr_id;
如果这个查询返回空结果,说明同步完全正确。
3. 删除外键约束
因为person表上存在指向personshallow表的外键约束person_personshallow_ptr_id_d7009fc0_fk_perso,不删除这个约束的话,没法直接删除personshallow表(数据库会因为外键依赖阻止删除):
ALTER TABLE person DROP CONSTRAINT person_personshallow_ptr_id_d7009fc0_fk_perso;
4. 删除personshallow表
确认数据没问题、约束也删除后,就可以删除目标表了:
DROP TABLE personshallow;
重要提醒
- 生产环境操作前务必备份数据,最好先在测试环境完整走一遍流程验证。
- 如果
person表的personshallow_ptr_id字段之后不再需要,也可以用ALTER TABLE person DROP COLUMN personshallow_ptr_id;删除它。
内容的提问来源于stack exchange,提问作者Olivier Pons
相关产品推荐
相关产品推荐

