如何删除Oracle中的所有引用表?

时间:2014-01-21 12:00:48

标签: sql oracle foreign-keys

我有表test0。该表由表引用:

test1
test2
test3
....
test150

是否可以编写简单的短查询来删除表test0中的1行,如果它们存在 - 在所有表中test1 ... test150?

3 个答案:

答案 0 :(得分:3)

尝试使用此函数获取给定父行的所有子行的删除脚本:

Create or replace
FUNCTION FN_GET_DELETE_SCRIPT
( Parent_ID IN VARCHAR2, Parent_Table_Name in varchar2   
) RETURN varchar2
AS 
sql_statement varchar2(200);
script varchar2(4000);
n pls_integer;
Tot Pls_Integer := 0;
Cc_Id Varchar2(500):=Null;
Cursor allTables 
Is    
   Select uc.table_name , ac.column_name
   from user_constraints uc , ALL_CONS_COLUMNS AC
   Where 
      R_Constraint_Name = (Select Constraint_Name  From User_Constraints Where Constraint_Type = 'P' And Table_Name = upper(Parent_Table_Name))
      And Ac.Owner = Uc.Owner
      And AC.constraint_name = uc.constraint_name;
Begin   
   for t in allTables loop
    execute immediate 'select count(*) from '||t.table_name ||' where '||t.column_name||' = :1' into n using Parent_ID;    
     If N > 0 Then    
        script:='Delete From ' ||t.table_name||' Where '||t.column_name||'='''||Parent_ID||''';'||chr(10)||script;
    End if; 
    End loop;
  Return Script;
END FN_GET_DELETE_SCRIPT;

请注意,此函数为您提供删除脚本,用于删除给定父行的直接子项。 所以这个函数需要一些修改才能找到给定父行的所有后代!

答案 1 :(得分:1)

  • 试试这个

     CREATE TABLE supplier 
     ( supplier_id numeric(10) not null, 
     supplier_name varchar2(50) not null, 
     contact_name varchar2(50),  
     CONSTRAINT supplier_pk PRIMARY KEY (supplier_id) 
     ); 
    
    
    
    CREATE TABLE products 
    (product_id numeric(10) not null, 
    supplier_id numeric(10) not null, 
    CONSTRAINT fk_supplier 
    FOREIGN KEY (supplier_id) 
    REFERENCES supplier(supplier_id) 
    ON DELETE CASCADE 
    ); 
    
  • 根据您的要求,首先删除所有约束并使用删除级联重新创建它们,如上面的示例所示

  • 删除供应商,它将减少该供应商的所有产品

  • 但在使用删除级联时要小心“你可能会错误地删除一半的数据库,甚至没有意识到它”

答案 2 :(得分:0)

你可以这样做:  alter table table_name drop constraint constraint_name;然后使用on delete cascade添加新约束。