删除表所有的约束(系统默认名约束删除)(存储过程)

来源:互联网 发布:剪辑拼接音乐软件 编辑:程序博客网 时间:2024/06/02 08:00

 

 


原文地址:http://akdora.wordpress.com/2007/01/12/to-remove-all-constraints/

译文:2010-08-10


 

我在编程的时候认识到,我创建了错误的约束,我发现了两个方法来弥补我的错误

1-删除表,并且重新创建表,我想这不是一个我需要的解决方式

    drop table table_name cascade constraints;

2-如果你的数据库中有很多的约束,你不可能一个一个去删除,约束是那么的长

    alter table table_name drop constraint constraint_name;


 

所以,你可以使用以下存储过程

create or replace procedure disable_fk_constraint is

cursor fke_cur is

select table_name, constraint_name

from user_constraints

where constraint_name like '<<some criteria to specify your constraints>>';

exstr varchar2(4000);

begin

  for fke_rec in fke_cur

  loop

    exstr := 'alter table ' || fke_rec.table_name ||

             ' drop constraint ' ||

              fke_rec.constraint_name;

    begin

      execute immediate exstr;

    exception

      when others then

                dbms_output.put_line('dynamic sql failure: ' || sqlerrm);

               dbms_output.put_line('on statement: ' || exstr);    end;

  end loop;

end disable_fk_constraint;

/

 

你也可以在存储过程中使用以下的查询语句

select table_name, constraint_name

from user_constraints

where constraint_name not like 'sys%' and table_name = 'table_name';


 

同时,有许多的约束名是以SYS_CXXXXX开头的,就像你在表中指定的非空约束一样

create table ht_projects (

   project_id              integer           not null,

   project_name            varchar2(100)     not null,

   start_date              date              not null,

   target_end_date         date              not null,

   actual_end_date         date

);

如果你想要通过上面的存储过程删除它们,仅仅更改查询语句就可以了

你可以通过以下查询语句查看到所有的约束:

   select table_name,constraint_name from user_constraints where table_name = 'table_name';