を外部キー制約を強制する:は、同じテーブルの列に次の表の値を入力しながら、SQLで同じテーブルの列に外部キーの制約を強制する方法
従業員:
- EMPID番号、
- マネージャ番号(既存の従業員でなければならない)
を外部キー制約を強制する:は、同じテーブルの列に次の表の値を入力しながら、SQLで同じテーブルの列に外部キーの制約を強制する方法
従業員:
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
希望すると助かります!
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への私のリンクを見てください。
テーブルを変更できない場合は、重要度の高い順に表示する必要があります。
それは解決策かもしれませんが、私の場合、「トリガー」はなく、「変更」は許されません。単純な 'create table'とそれに続く 'inserts'は必要です。今? –
@popstack、私はあまりにも多くのことを言っていたので、私は答えに編集を追加しました。 – Ben
参照する外部キー制約の一意または外部キー制約を定義する必要があることは間違いありません。また、他のRDBMSの 'ON DELETE RESTRICT'節のように機能する' ON DELETE'節を省略することができ、子レコードを持つ親の削除を防ぐことができます。 –
セルフリファレンス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;
...! oracleの他の方法や提案はありますか? –
私は一度も試したことはありませんが、 "parent_table_name"の代わりにTABLE_NAMEを使用すると効果があると思います!! – instanceOfObject
これは、Oracleの有効なステートメントではありません –