我有表test0。该表由表引用:
test1
test2
test3
....
test150
是否可以编写简单的短查询来删除表test0中的1行,如果它们存在 - 在所有表中test1 ... test150?
答案 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添加新约束。