2013-01-25 51 views
2

我對SQL很陌生,因此回答我的問題應該很容易。將3個步驟合併爲一個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跑的?或者更好的方式來執行從表中刪除?

,我會非常感激

+2

取出最後的「末端」從1開始,第一個從3開始? –

+0

但要非常小心 - 您有潛在的風險,無法在2之後重新激活約束條件。 –

+0

謝謝!你有另一種方法來刪除他的表格內容嗎? – user2010988

回答

1

如果只是從有外鍵彼此表刪除,你可以隨時在約束爲​​了刪除(「兒童優先」)。那麼你根本就不必mess your你的約束。不要忘記最後提交。

如果是關於速度,那麼您可能希望禁用約束並通過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; 
...