2

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

这是我想做的事情:

  1. 停用约束:

    停用数据库中的约束:

    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;  
    
  2. 从表中删除:

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

    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 上运行它?或者也许是一种更优雅的方式来执行从表中删除?

我会非常感谢

4

1 回答 1

1

如果只是从具有彼此外键的表中删除,则始终可以按约束顺序删除(“孩子优先”)。然后,您将根本不必弄乱您的约束。不要忘记在最后提交。

如果它与速度有关,那么您可能希望禁用约束并通过 TRUNCATE 而不是 DELETE 清空表。但是,您不应该删除模式的所有约束,而应该只删除受影响表的指向另一个受影响表的外键。这将防止你射中你的脚。您可以在不循环的情况下做到这一点,只需明确禁用约束即可。乙

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

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;
...
于 2013-04-20T11:53:13.220 回答