我对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||' 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上运行它?或者可能是一种更优雅的方式从表中执行删除?
我会非常感激
答案 0 :(得分: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;
...