将3个步骤合并到一个SQL脚本中
我对SQL很陌生,所以回答我的问题应该很容易 以下是我想做的:将3个步骤合并到一个SQL脚本中,sql,database,oracle,Sql,Database,Oracle,我对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 =
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;
停用数据库中的约束:
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上运行它吗?或者是一种更优雅的方式来执行表中的删除
如果只是从相互之间有外键的表中删除,我将非常感激,您可以始终按约束顺序(“先删除子项”)。这样你就根本不必去处理你的约束了。最后别忘了承诺 如果是关于速度,那么您可能希望禁用约束并通过TRUNCATE而不是DELETE清空表。但是,您不应该删除模式的所有约束,而应该只删除指向另一个受影响表的受影响表的外键。这将防止你射入你的脚。您可以在不循环的情况下执行此操作,只需显式禁用约束即可。E 所以整个脚本应该是这样的
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;
...
去掉最后一个“结束;”从1。第一个“开始”是从3开始的吗?但是要非常小心-在2之后,您可能无法重新激活约束。您可以对删除进行排序,以便按照正确的顺序删除(“孩子”第一,“家长”最后)。或者将FK约束声明为“可延迟”,在这种情况下,将在提交时对其进行评估,而不是在运行
DELETE
时。问题与其说是您删除的方式,不如说是您正在删除的方式。我想您删除约束只是为了加快速度,但很容易想象在删除数据后无法重新启用外键…您可以将约束定义为延迟,这样,您就不必担心正确的顺序,在提交DELETE
事务时,将对约束进行评估。