2016-03-17 137 views
8

我有一個MySql模式,它使用class table inheritance,但我希望子表具有從父表和級聯表中級聯刪除。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,帶有外鍵(child)的行將被指向一個不再存在的行(父),您將得到一個INTEGRITY CONSTRAINT VIOLATION

相反,沒有這樣的問題,刪除孩子沒有刪除父母沒有離開行,並沒有INTEGRITY CONSTRAINT VIOLATION就MySQL而言,沒有級聯是必要的。

如果你想一起刪除孩子,父母和其他引用的行,你有幾個選項。

多語句/程序

  • 首先刪除了孩子,然後父,然後其他記錄(無需爲ON DELETE CASCADE S)
  • 首先刪除了孩子,那麼其他記錄,然後父(不需要對ON DELETE CASCADE多個)
  • 第一刪除父,那麼其它記錄(只需要ON DELETE CASCADE父參考)
  • 刪除其他戰績第一,然後在父(僅適用於其他參考需要ON DELETE CASCADE

觸發

  • 廣場上AFTER DELETE上刪除家長和其他記錄的子表的觸發器(任順序),然​​後刪除子將清除所有三個記錄(無需爲ON DELETE CASCADE S)

變化的關係:

  • 如果你可以改變其他表之間的關係(A或B),以便它引用的孩子,不是孩子引用其他表(如您目前),並保持ON DELETE CASCADE S,刪除父行將依次清除孩子和其他記錄。