将3个步骤合并到一个SQL脚本中

将3个步骤合并到一个SQL脚本中,sql,database,oracle,Sql,Database,Oracle,我对SQL很陌生,所以回答我的问题应该很容易 以下是我想做的: 停用约束: begin for cur in (select fk.owner, fk.constraint_name , fk.table_name from all_constraints fk, all_constraints pk where fk.CONSTRAINT_TYPE = 'R' and pk.owner =

我对SQL很陌生,所以回答我的问题应该很容易

以下是我想做的:

  • 停用约束:

    begin
      for cur in (select fk.owner, fk.constraint_name , fk.table_name 
                  from all_constraints fk, all_constraints pk 
                  where fk.CONSTRAINT_TYPE = 'R' and 
                        pk.owner = 'USER1' and
                        fk.R_CONSTRAINT_NAME = pk.CONSTRAINT_NAME ) loop
           execute immediate 'ALTER TABLE '||cur.owner||'.'||cur.table_name||' MODIFY CONSTRAINT '||cur.constraint_name||' ENABLE NOVALIDATE';
       end loop;
    end; 
    
    停用数据库中的约束:

    begin
        for cur in (select fk.owner, fk.constraint_name , fk.table_name 
               from all_constraints fk, all_constraints pk 
               where fk.CONSTRAINT_TYPE = 'R' and 
                     pk.owner = 'USER1' and
                     fk.R_CONSTRAINT_NAME = pk.CONSTRAINT_NAME ) loop
            execute immediate 'ALTER TABLE '||cur.owner||'.'||cur.table_name||' MODIFY CONSTRAINT '||cur.constraint_name||' DISABLE';
        end loop;
    end;  
    
  • 从表中删除:

    delete from USER_TEST.Table1;                
    delete from USER_TEST.Table2;               
    delete from USER_TEST.Table3; 
    
  • 重新激活约束:

    begin
      for cur in (select fk.owner, fk.constraint_name , fk.table_name 
                  from all_constraints fk, all_constraints pk 
                  where fk.CONSTRAINT_TYPE = 'R' and 
                        pk.owner = 'USER1' and
                        fk.R_CONSTRAINT_NAME = pk.CONSTRAINT_NAME ) loop
           execute immediate 'ALTER TABLE '||cur.owner||'.'||cur.table_name||' MODIFY CONSTRAINT '||cur.constraint_name||' ENABLE NOVALIDATE';
       end loop;
    end; 
    
  • 有人知道如何将这些步骤组合成一个
    .sql
    脚本,以便我可以在Oracle SQLDeveloper上运行它吗?或者是一种更优雅的方式来执行表中的删除


    如果只是从相互之间有外键的表中删除,我将非常感激,您可以始终按约束顺序(“先删除子项”)。这样你就根本不必去处理你的约束了。最后别忘了承诺

    如果是关于速度,那么您可能希望禁用约束并通过TRUNCATE而不是DELETE清空表。但是,您不应该删除模式的所有约束,而应该只删除指向另一个受影响表的受影响表的外键。这将防止你射入你的脚。您可以在不循环的情况下执行此操作,只需显式禁用约束即可。E

    所以整个脚本应该是这样的

    Alter Table User_test.Table1 Modify Constraint FK... Disable;
    Alter Table User_test.Table2 Modify Constraint FK... Disable;
    ...
    
    Trunacte Table user_test.Table1;
    Trunacte Table user_test.Table2;
    ...
    
    Alter Table User_test.Table1 Modify Constraint FK... Enable;
    Alter Table User_test.Table2 Modify Constraint FK... Enable;
    ...
    

    去掉最后一个“结束;”从1。第一个“开始”是从3开始的吗?但是要非常小心-在2之后,您可能无法重新激活约束。您可以对删除进行排序,以便按照正确的顺序删除(“孩子”第一,“家长”最后)。或者将FK约束声明为“可延迟”,在这种情况下,将在提交时对其进行评估,而不是在运行
    DELETE
    时。问题与其说是您删除的方式,不如说是您正在删除的方式。我想您删除约束只是为了加快速度,但很容易想象在删除数据后无法重新启用外键…您可以将约束定义为延迟,这样,您就不必担心正确的顺序,在提交
    DELETE
    事务时,将对约束进行评估。