2016-03-17 36 views
8

私はclass table inheritanceを使用するMySqlスキーマを持っていますが、子テーブルに親テーブルと外部テーブルからのカスケード削除が必要です。2テーブルからMySqlカスケード削除

create table parent (
    _key bigint unsigned not null, 
    name varchar(64) unique not null, 
    primary key(_key) 
); 

create table child_a (
    _key bigint unsigned not null, 
    foreign_key_a bigint unsigned not null, 
    foreign key(_key) references parent(_key) on delete cascade, 
    foreign key(foreign_key_a) references a(_key) on delete cascade, 
    primary key(_key) 
); 

create table child_b (
    _key bigint unsigned not null, 
    foreign_key_b bigint unsigned not null, 
    foreign key(_key) references parent(_key) on delete cascade, 
    foreign key(foreign_key_b) references b(_key) on delete cascade, 
    primary key(_key) 
); 

問題は、レコードが外部テーブルのいずれかから削除されたとき、それは子テーブルからではなく、親テーブルからレコードを削除しますです。私は解決策としてストアドプロシージャ/マルチステートメントを使用したくないでしょう。なぜなら、外部テーブルにはカスケード削除があるからです。そのためにもストアドプロシージャが必要です。

+0

**削除カスケード**文を使用すると、親が削除されたときに、外部キーに関連する子を削除できます。おそらくあなたの場合は、あなたが使用しなければならないものではありませんか? –

答えて

11

ON DELETE CASCADEは、参照元のテーブル(親)の行が削除されたときに、外部キー(子)を持つテーブルの行を削除します。 ON DELETE CASCADEを指定しないと、外部キー(子)を持つ行は、もはや存在しない行(親)を指すようになり、INTEGRITY CONSTRAINT VIOLATIONになります。

このような問題はありません。親を削除せずに子を削除すると、孤立した行はなくなります。INTEGRITY CONSTRAINT VIOLATION MySQLに関してはカスケードは必要ありません。

子、親、および他の参照行を一緒に削除する場合は、いくつかのオプションがあります。

複数ステートメントの/手順

  • 最初の子を削除し、その後、親や、他のレコード(ON DELETE CASCADEのための必要はありません)
  • は、最初の子を削除しますが、その後、他のレコードと、親を削除する(ON DELETE CASCADEの必要はありません)
  • 親を最初に削除し、次に他のレコードを削除します(親参照にはON DELETE CASCADEが必要)
  • レコードの最初に、親(他の唯一の参照にON DELETE CASCADE必要)

トリガー:親や他のレコードを削除、子テーブルの上にAFTER DELETE

  • 場所トリガー(のいずれかで順)、その後、すべての3つのレコードがクリアされます子を削除(ON DELETE CASCADEのための必要はありません)

変更の関係:

  • それは子供を参照するように、あなたは他のテーブル(AまたはB)に関係を変更することができますし、子供が他のテーブルを参照していない(あなたが現在持っているように)、およびON DELETE CASCADE Sを維持し、削除した場合親の行は子をクリアし、次に他のレコードを順番に消去します。
関連する問題