通常在使用dts 迁移数据时,在源端业务不停直接迁移或者业务停止迁移操作不当,会遇到违反引用约束的报错,如下
创建外键时子表里存在父表不存在的数园
当出现时,常见的解决办法如下:
注:操作时,为保证数据安全,请提前评估,按需进行备份
1、删除子表多余数据
这种情况是由于迁移时源端业务不停止,整体迁移表顺序不当。
先查询子表多余数据
SELECT ID,ENTERPRISE_INFO_ID
FROM GCLOUD_NAP.NAME_ENTERPRISE_EXTEND_INFO CHILD --子表
WHERE NOT EXISTS (
SELECT 1
FROM GCLOUD_NAP.NAME_ENTERPRISE_INFO PARENT --父表
WHERE PARENT."ID" = CHILD."ENTERPRISE_INFO_ID"
);
删除子表多余数据
delete from GCLOUD_NAP.NAME_ENTERPRISE_EXTEND_INFO where ENTERPRISE_INFO_ID in (
SELECT ENTERPRISE_INFO_ID
FROM GCLOUD_NAP.NAME_ENTERPRISE_EXTEND_INFO CHILD --子表
WHERE NOT EXISTS (
SELECT 1
FROM GCLOUD_NAP.NAME_ENTERPRISE_INFO PARENT
WHERE PARENT."ID" = CHILD."ENTERPRISE_INFO_ID" -- 父表
)
)
;
commit;
重新添加约束
ALTER TABLE "GCLOUD_NAP"."NAME_ENTERPRISE_EXTEND_INFO" ADD FOREIGN KEY("ENTERPRISE_INFO_ID") REFERENCES "GCLOUD_NAP"."NAME_ENTERPRISE_INFO"("ID") ON DELETE CASCADE ;
2、重新迁移
选择分三步,先迁定义,后迁数据,最后迁移约束和索引的方法,重新迁移
(1)第一次只选择表定义,不选择约束等,如图:
(2)第一次迁移完成后(确保没有错误),第二次只选择数据,如图:
(3)第三步选择约束、索引等,如图:
按照上面三步迁移,基本上都可以顺利迁移成功
