次のテーブルに値を入力するときに、SQLの同じテーブルの列に外部キーの制約を適用する方法:
従業員:
- エンピッドナンバー、
- マネージャー番号(既存の従業員である必要があります)
次のテーブルに値を入力するときに、SQLの同じテーブルの列に外部キーの制約を適用する方法:
従業員:
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へのリンクを参照してください。
テーブルを変更できない場合は、重要度の高い順に変更する必要があります。
自己参照クエリ..。
Alter table table_name ADD constraints constraints_name foreign key(column_name1,column_name2..) references table_name(column_name1,column_name2...) ON DELETE CASCADE;
元-ALTER TABLE Employee ADD CONSTRAINTS Fr_key( mgr_no) references employee(Emp_no) ON DELETE CASCADE;
CREATE TABLE TABLE_NAME (
`empid_number` int ( 11) NOT NULL auto_increment,
`employee` varchar ( 100) NOT NULL ,
`manager_number` int ( 11) NOT NULL ,
PRIMARY KEY (`empid_number`),
CONSTRAINT `manager_references_employee`
FOREIGN KEY (`manager_number`) REFERENCES (`empid_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
それが役に立てば幸い!