web-dev-qa-db-ja.com

名前が付けられていない場合の外部キーの削除

'student'という名前のテーブルを次のように作成しました。

create table student(
  stud_id number primary key, 
  stud_name varchar2(30) not null, 
  branch_id varchar2(4) references branch(branch_id),
  course_id number references course(course_id),
  hostel varchar2(4)
);

その後、course_id列は必要ないことがわかりました。今度はその列を削除します。削除しようとすると、「SYSが所有するテーブルから列を削除できません」という警告メッセージが表示されたので、最初に外部キー制約を削除してからテーブルを削除する必要がありますが、それはうまくいきませんでした。私が使用した:

alter table student drop column course_id; 

制約に名前を付けなかったため、次のステートメントは使用できません。

alter table student drop constraint;

Oracleデータベース11gを使用しています

1
Rubbal Bhusri

cascade constraintsを使用して、列に関連する制約を削除することもできます。

alter table student drop column course_id cascade constraints;

列の削除句の詳細については、 マニュアル内 を参照してください。

制約が実際にどのように命名されたかを知りたい場合(たとえば、列ではなく制約のみを削除したい場合)、これについてシステムカタログをクエリできます。

select constraint_name
from user_cons_columns
where table_name = 'STUDENT'
and column_name = 'COURSE_ID';

それはSYS_C0052446のようなものを返します(それはwillはシステム上で異なる値になります)。そして、その名前はドロップ制約に使用できます。

alter table student drop constraint SYS_C0052446;

システムカタログの詳細については、次を参照してください マニュアル内

A_horse_with_no_nameによる答えはほとんどの状況で十分ですが、生成された制約名が異なる可能性がある複数のデータベースにわたってこれを自動化する必要がある場合は、次のようにすることができます。

declare
   constraintname varchar2(512);  
begin  
    select constraint_name
    INTO constraintname 
    from user_cons_columns
    where table_name = 'student'
    and column_name = 'course_id'
    AND position = 1;

    execute immediate 'alter table student DROP constraint ' || constraintname;
end;  
/
0
Roger