'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を使用しています
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;
/