2012-01-07 2 views

答えて

-2
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 

希望すると助かります!

+0

...! oracleの他の方法や提案はありますか? –

+0

私は一度も試したことはありませんが、 "parent_table_name"の代わりにTABLE_NAMEを使用すると効果があると思います!! – instanceOfObject

+3

これは、Oracleの有効なステートメントではありません –

20

Oracleは、これを自己参照整合性制約と呼びます。私はあなたのmanager_noがNULL可能であることを仮定してい

alter table employees 
    add constraint employees_emp_man_fk 
     foreign key (manager_no) 
     references employees (emp_id) 
    on delete set null 
     ; 

:ドキュメントには、あなたが通常の1をするのと同じ方法で、自己参照制約を作成するための説明here

です。 delete cascadeが大量のテーブルを消してしまうので、ここではnullを追加しました。

私はこれを行うより良い方法を考えることはできません。マネージャーを削除すると、すべての従業員が削除されてはならないので、set nullにする必要があり、マネージャーがいない人に警告するためにテーブルにトリガーがあります。

私はいつもthisサイトが好きです。これは簡単な参照に適しています。 FKでもインデックスを持っていることを忘れないでください。あるいはTomがあなたに叫ぶでしょう:-)。

次のような標準のOracle構文を使用して、create table文に自己参照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 
); 

EDIT:以下の@ popstackさんのコメントに答えて

あなたが1つのステートメントでこれを行うことができなくなり表を変更することができないが事務のかなりとんでもない状態です。あなたは間違いなくあなたが選択しようとしているテーブルを分析しなければなりません。そうしないと、あなたがしようとしている外部キーを使用するときはいつも、外部キー(および場合によってはより多くのカラムおよび/またはインデックス)フルテーブルスキャン。上のasktomへの私のリンクを見てください。

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

  1. できることを確認してください。
  2. あなたのDBデザインを変更するには、FKがインデックスを持っている必要があります。もしあなたがそれを持っていなければ、FKはおそらく行く方法ではありません。マネージャーのテーブルと従業員のテーブルがあるかもしれませんか?
+0

それは解決策かもしれませんが、私の場合、「トリガー」はなく、「変更」は許されません。単純な 'create table'とそれに続く 'inserts'は必要です。今? –

+0

@popstack、私はあまりにも多くのことを言っていたので、私は答えに編集を追加しました。 – Ben

+0

参照する外部キー制約の一意または外部キー制約を定義する必要があることは間違いありません。また、他のRDBMSの 'ON DELETE RESTRICT'節のように機能する' ON DELETE'節を省略することができ、子レコードを持つ親の削除を防ぐことができます。 –

1

セルフリファレンスQUERY ...やや

Alter table table_name ADD constraints constraints_name foreign key(column_name1,column_name2..) references table_name(column_name1,column_name2...) ON DELETE CASCADE; 

EX- ALTER TABLE Employee ADD CONSTRAINTS Fr_key(mgr_no) references employee(Emp_no) ON DELETE CASCADE;

関連する問題