2012-08-09 74 views
1

我想從一個表中刪除某個字段,我希望它從一個不同的表中刪除所有關聯的字段(包含適當的FK)。PHP SQLite與外鍵刪除級聯多個條目

表1

 id | name | fname 

表2

 id | table1Id | ... 

的table1Id被設置爲一個外鍵引用表1的主鍵。我將ON DELETE CASCADE

現在我的代碼很簡單,它刪除表1中的行,如下所示:

function deleteWill($Id) 
    { 
     $stmt = $this->db->stmt_init(); 
     if($stmt->prepare('DELETE FROM Table1 where id= ?')) 
     { 
      $stmt->bind_param("i", $Id); 
      $stmt->execute(); 
      $stmt->close(); 
      return true; 
     } 
     else 
     { 
      $stmt->close(); 
      return false; 
     } 
    } 

但是CASCADE選項不起作用!

這是否與表2中有多行具有相同fk的事實有關?

如果是這樣,我該如何解決這個問題,以便它刪除表2中的所有關聯行?

回答

1

不,表2中的多行應該不成問題。

沒有足夠的信息來確定導致您觀察到的行爲的原因。 如果您的語句成功完成,並且預期的行將從Table1中刪除,但Table2中的匹配行不會被刪除...

然後第一個嫌疑犯是您的表使用的是MyISAM引擎,而不是InnoDB引擎。 (MyISAM不執行外鍵約束,但InnoDB執行。)從輸出:

SHOW CREATE TABLE Table1 
SHOW CREATE TABLE Table2 

將揭示正在使用哪個發動機。我會從那裏開始。還有其他一些可能性,例如驗證foreign_key_check = 1;


要對MyISAM數據表更換引擎InnoDB的:

ALTER TABLE Table1 ENGINE = InnoDB ; 

這將需要重建整個表的;它基本上需要創建一個新的InnoDB表並複製MyISAM表中的所有數據。所以,不要在大桌子上使用它...