Sql 如何在Oracle上对多个表上的插入进行排序,以便不破坏FK约束
Sql 如何在Oracle上对多个表上的插入进行排序,以便不破坏FK约束,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,我需要把数据库从Oracle 12带到Oracle 11。我使用sqlexplorer为对象创建了所有DDL,经过一些小的调整后,它工作得很好。但是当我导出数据时,我得到了一堆按表名排序的插入,如下所示 @C:\Users\RubensdoAmaralNeto\DBScripts\TABLE_A.sql @C:\Users\RubensdoAmaralNeto\DBScripts\TABLE_B.sql @C:\Users\RubensdoAmaralNeto\DBScripts\TABLE_C
我需要把数据库从Oracle 12带到Oracle 11。我使用sqlexplorer为对象创建了所有DDL,经过一些小的调整后,它工作得很好。但是当我导出数据时,我得到了一堆按表名排序的插入,如下所示
@C:\Users\RubensdoAmaralNeto\DBScripts\TABLE_A.sql
@C:\Users\RubensdoAmaralNeto\DBScripts\TABLE_B.sql
@C:\Users\RubensdoAmaralNeto\DBScripts\TABLE_C.sql
...
如果我尝试按原样运行它,它将不起作用,因为它破坏了许多FK约束
是否有一种方法可以对这些插入进行排序,然后手动执行此操作?可能使用SQL资源管理器或SQLPlus。有150多个表相互关联。这里有一个递归CTE,我认为它应该按照插入的顺序列出所有表。假设所有表都在当前架构中。lvl为0的任何内容都可以按任何顺序运行
with t (table_name, lvl) as (
-- tables with no foreign keys on them
select table_name, 0 as lvl from user_tables where table_name not in (select table_name from user_constraints where constraint_type = 'R')
union all -- tables with foreign keys pointing to previous tables
select c.table_name as table_name, t.lvl+1 as lvl
from t
join user_constraints r on r.table_name = t.table_name
join user_constraints c
on c.constraint_type = 'R'
and r.constraint_name = c.r_constraint_name
) cycle table_name set is_cycle to 1 default 0
select table_name, lvl,
'@C:\Users\RubensdoAmaralNeto\DBScripts\' || table_name || '.sql' as script
from t
order by lvl;
只需将第三列复制并粘贴到文本文件中,然后保存脚本。快速而肮脏的答案-禁用所有约束,进行插入,然后重新启用约束。希望您的数据是“干净”的,并且在禁用约束时没有其他人偷偷进入