0

外部キーを使用して MySQL でリレーションシップを作成しようとしています。forienキーの作成に成功するたびに、テーブルを記述すると、キーは「MUL」と見なされます。親テーブルにいくつかのレコードを挿入した後、子で null 値を取得します。私はこれを何時間も研究してきましたが、手ぶらで出てきました。innodb のステータスも確認しましたが、外部キーのエラー レポートはありません。null 値を取得する理由は完全にはわかりませんが、「MUL」キー値が原因であると想定しています。誰かがこれを確認して、私を助けてくれますか?

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 borrow (empID, book) values (1,'mike');
4

1 に答える 1

2

「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ます。

于 2012-12-12T23:34:57.037 に答える