「MUL」は、それが一意のインデックスではないことを意味します (つまり、KEY に重複した値が許可されます)。(一意のインデックスの場合、キー列には「UNI」が表示されます)。FOREIGN KEY 制約は、外部キー列の一意性とは何の関係もありません...通常は一意ではありません...通常、親はゼロ、1つ、または複数の子を持つことができます。
FOREIGN KEY 制約は、子テーブルの NULL 値を禁止しません。NOT NULL 制約 (またはトリガー) だけがそれを行います。子テーブルの行が孤立していて、親に関連付けられていないことは完全に合理的です。
子テーブルに INSERT を実行するとき、その行で親テーブルの行を参照する場合は、外部キー列に NULL 以外の値を指定する必要があります。
外部キーはON DELETE SET NULL
句で定義できますが、関連する子を持つ親行を後で削除する場合にのみ有効です。その場合、親行が削除されると、子行の外部キー列の値が NULL に設定されます。
Mike は次のように述べています。私は、子の外部キーが親によって取り込まれていないことを懸念しています。
親は、子の外部キー列を移入する責任を負いません。親の id 値が変更されたときに子の外部キー値を自動的に更新するオプションがあります...関係を維持します:ON UPDATE CASCADE。ON UPDATE
ただし、 or句によって実行されるアクションを除いてON DELETE
、親には子テーブルの値を維持する責任はありません。
Mike の質問: では、親から子の列を取得するにはどうすればよいでしょうか?
あなたはしません。まず、行を親テーブルに配置 (または挿入) します。次にid
、子行を挿入するときに、列の値 (または PRIMARY KEY を構成する列の値) を保持し、子行の外部キー列に同じ値を使用します。
外部キーを任意の値 (親テーブルの既存の PRIMARY KEY 値と一致しない値) に設定すると、エラーが返されます。これは予期された動作です。
親の前に子行を挿入する場合は、外部キー列を NULL のままにしておく必要があります。id
親の値がわかったら、子行を更新して外部キー列を設定します。
create table employee
( id int
, first varchar(128)
, last varchar(128)
, primary key(id) ) engine=innodb;
create table borrow
(ref auto_increment
, empID int
, book varchar(128)
, primary key(ref) ) engine=innodb;
alter table borrow add constraint fk_borrow
foreign key (empID) references employee(id);
insert into employee (id, first, last) values (1, 'foo', 'bar');
insert into borrow (empID, book) values (1,'mike');
insert into borrow (empID, book) values (1,'mulligan');
テーブルに追加された 2 つの行は、従業員テーブルborrow
の値と一致する値に設定されている外部キー列 (empID) の値によって、employee の行に関連付けられていid
ます。