sql >> データベース >  >> RDS >> Oracle

同じテーブルの列に外部キー制約を適用します

    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を使用することはおそらく不可能です。たぶん、マネージャーのテーブルと従業員のテーブルがありますか?


    1. SQLServerのUNIX_TIMESTAMP

    2. SQL Server2008でテーブルエイリアスを使用してUPDATESQLを作成するにはどうすればよいですか?

    3. PostgreSQL列'foo'は存在しません

    4. PG列をNULLABLETRUEに変更するにはどうすればよいですか?