0

私は2つのテーブルを持っています:

id box_name hidden

---------------------------

id item_name box_id hidden

したがって、外部キーはbox_idです。ボックスが削除または更新された場合、子アイテムにも影響しますが、隠しフィールドで同じことを行うにはどうすればよいですか。ボックスを非表示にすると、同じタイプのint(11)のインデックスになります、すべての子が隠されていますが、box_idを参照する子だけを非表示にする方法-> id、非表示の子???

つまり、2 つの外部キーを作成する方法

4

2 に答える 2

1

id,hiddenこれは、親テーブルのフィールドに一意の制約を追加し、詳細テーブルを変更して、FK をid,hiddenではなく ()にすることで簡単に実行できますidhiddenただし、この場合、属性は常に親と同じであるため、詳細テーブルに属性を格納する必要がある理由がわかりませんhidden

詳細テーブルの必要なすべての行を更新する更新後トリガーをマスター テーブルに追加したいと思います。

更新します。例。
最初のアプローチ

CREATE TABLE boxTable(id int not null auto_increment primary key,hidden 
tinyint not null,
...
CONSTRAINT UQ_BOXTABLE(id,hidden));
CREATE TABLE childTable(...., boxId int not null, hidden tinyint not null,
 CONSTRAINT FK_childTable_BoxTable FOREIGN KEY (boxId, hidden) REFERENCES 
 boxTable(boxId, hidden) ON DELETE CASCADE ON UPDATE CASCADE) ;

boxTableを変更hiddenするたびに、 で自動的に更新されchildTableます。

2番目のアプローチ(構文を再確認します。現時点ではmysqlを持っていません)

CREATE TRIGGER AU_boxTable AFTER UPDATE ON boxTable 
FOR EACH ROW
BEGIN 
  IF (new.hidden <> old.hidden) THEN 
    update childTable set hidden = new.hidden WHERE boxId = new.id;
  END IF;
END;

2 番目のアプローチhiddenでは、値に関係なく childTable のフィールドを変更できますboxTableが、最初のアプローチでは変更できません。

于 2012-12-05T17:23:32.233 に答える
1

外部キーの目的を誤解していると思われます。それらは基本的に参照整合性を強制するように設計されているため、ターゲット行が存在しない外部キーを物理的に格納することはできません。また、それらはそのような整合性の維持にも役立つため、別のテーブルで参照されている行を削除しようとすると、許可されていないか、カスケード削除が行われます。

しかし、外部キーを使用して任意のカスケード更新を実行する方法はありません。それらは単にそのために設計されていません。

おそらく、あなたはトリガーを考えています:-?

于 2012-12-05T17:56:38.210 に答える