刪除表所有的約束(系統預設名約束刪除)(儲存過程)
譯文: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';