10

次のテーブルに値を入力するときに、SQLの同じテーブルの列に外部キーの制約を適用する方法:

従業員

  • エンピッドナンバー、
  • マネージャー番号(既存の従業員である必要があります)
4

3 に答える 3

21

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へのリンクを参照してください。

テーブルを変更できない場合は、重要度の高い順に変更する必要があります。

  1. あなたができる方法を見つけてください。
  2. FKにはインデックスが必要であるため、DB設計を変更します。インデックスを作成できない場合は、FKを使用することはおそらく不可能です。たぶん、マネージャーのテーブルと従業員のテーブルがありますか?
于 2012-01-07T10:39:50.690 に答える
1

自己参照クエリ..。

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;

于 2013-08-13T16:54:57.053 に答える
-1
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

それが役に立てば幸い!

于 2012-01-07T07:44:22.827 に答える