如何将带外键关联的EMP/DEPT表数据迁移至NEW_EMP/NEW_DEPT表
解决EMP到NEW_EMP的数据迁移并维护外键关联
核心问题分析
你已经完成DEPT到NEW_DEPT的迁移,其中NEW_DEPT.dept_id由序列生成,dname是原DEPT.dname拼接原DEPT.dept_id得到的。现在要迁移EMP到NEW_EMP,关键是建立原DEPT.dept_id与新NEW_DEPT.dept_id的映射关系,才能保证外键关联正确。
方案一:直接通过拼接字段关联映射
利用NEW_DEPT.dname的拼接规则(原dname_原dept_id),反向关联原DEPT表,匹配对应的新dept_id后直接插入NEW_EMP:
INSERT INTO NEW_EMP(emp_id, emp_name, dept_id) SELECT emp.emp_id, emp.emp_name, new_dept.dept_id FROM EMP emp -- 关联原DEPT获取员工所属部门的原始信息 JOIN DEPT dept ON emp.dept_id = dept.dept_id -- 通过拼接后的dname匹配NEW_DEPT,拿到新部门ID JOIN NEW_DEPT new_dept ON new_dept.dname = dept.dname || '_' || dept.dept_id;
方案二:提前存储部门ID映射(更可靠)
如果担心拼接字段可能出现冲突,或者需要复用映射关系,可先创建临时表存储新旧部门ID的对应关系,再完成迁移:
- 创建临时映射表:
CREATE TABLE DEPT_MAPPING (old_dept_id NUMBER, new_dept_id NUMBER);
- 填充映射关系(基于已插入的
NEW_DEPT数据):
INSERT INTO DEPT_MAPPING(old_dept_id, new_dept_id) SELECT dept.dept_id, new_dept.dept_id FROM DEPT dept JOIN NEW_DEPT new_dept ON new_dept.dname = dept.dname || '_' || dept.dept_id;
- 通过映射表迁移
EMP数据:
INSERT INTO NEW_EMP(emp_id, emp_name, dept_id) SELECT emp.emp_id, emp.emp_name, mapping.new_dept_id FROM EMP emp JOIN DEPT_MAPPING mapping ON emp.dept_id = mapping.old_dept_id;
验证建议
迁移前先执行以下查询,确认关联结果与目标NEW_EMP数据一致:
SELECT emp.emp_id, emp.emp_name, new_dept.dept_id FROM EMP emp JOIN DEPT dept ON emp.dept_id = dept.dept_id JOIN NEW_DEPT new_dept ON new_dept.dname = dept.dname || '_' || dept.dept_id;
内容的提问来源于stack exchange,提问作者smriti
相关产品推荐
相关产品推荐

