1. 程式人生 > >刪除表所有的約束(系統預設名約束刪除)(儲存過程)

刪除表所有的約束(系統預設名約束刪除)(儲存過程)

譯文: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';