Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Oracle上对多个表上的插入进行排序,以便不破坏FK约束_Sql_Oracle_Oracle Sqldeveloper - Fatal编程技术网

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;

只需将第三列复制并粘贴到文本文件中,然后保存脚本。

快速而肮脏的答案-禁用所有约束,进行插入,然后重新启用约束。希望您的数据是“干净”的,并且在禁用约束时没有其他人偷偷进入