Oracleは、これを自己参照整合性制約と呼んでいます。ドキュメントは説明のためにここにあります
通常の制約と同じ方法で自己参照制約を作成します。
alter table employees
add constraint employees_emp_man_fk
foreign key ( manager_no )
references employees ( emp_id )
on delete set null
;
あなたのmanager_no
null許容です。ここにdelete cascade
としてsetnullを追加しました おそらくあなたのテーブルのかなりの量を一掃するでしょう。
これを行うためのより良い方法は考えられません。マネージャーを削除しても、すべての従業員が削除されるわけではないため、set null
を設定する必要があります テーブルにトリガーを設定して、マネージャーがいない人に警告します。
私はいつもこのサイトが好きです。これは簡単な参照に適しています。 FKにもインデックスを付けることを忘れないでください。そうしないと、トムがあなたに怒鳴ります:-)
標準のOracle構文を利用して、createtableステートメントで自己参照FKを作成することもできます。これは次のようになります。
create table employees
( emp_id number
, other_columns ...
, manager_no number
, constraint employees_pk
primary key (emp_id)
, constraint employees_man_emp_fk
foreign key ( manager_no )
references employees ( emp_id )
on delete set null
);
編集:
以下の@popstackのコメントへの回答:
1つのステートメントでこれを行うことはできますが、テーブルを変更できないことは、かなりばかげた状況です。選択しようとしているテーブルを確実に分析する必要があります。そうしないと、外部キーを使用するたびに、外部キーのインデックス(および場合によってはより多くの列やインデックス)が必要になります。全表スキャン。上記のasktomへのリンクをご覧ください。
テーブルを変更できない場合は、重要度の高い順に変更する必要があります。
- 方法を確認してください。
- FKにはインデックスが必要であるため、DB設計を変更します。インデックスを作成できない場合は、FKを使用することはおそらく不可能です。たぶん、マネージャーのテーブルと従業員のテーブルがありますか?