2012-12-31 40 views
1

缺失的結果,比方說,我有兩個表:MySQL的 - 從數據表Y的基礎上刪除從表X

tableA 
------- 
type (varchar) 
name (varchar) 

tableB 
------- 
name (varchar) 
... 

我想從那裏tableA刪除type='foo'的所有記錄。我能做到這一點,如下所示:

$STH=$DBH->prepare("DELETE FROM tableA WHERE type = :t"); 
$STH->bindParam(':t','foo'); 
try { 
    $STH->execute(); 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

然後我想說明在每個我從tableA刪除,並使用這tableB刪除任何記錄這些名稱的記錄name領域。我怎樣才能做到這一點?

我想要的東西相當於$DBH->lastInsertId();,只不過它將所有name字段從已刪除的記錄中傳回。

謝謝。

回答

5

你可以加入這兩個表,並對其執行刪除,例如

DELETE a, b 
FROM table1 a 
     INNER JOIN table2 b 
      ON a.name = b.name 
WHERE a.type = 'foo' 
+0

感謝這個很好的解決方案。非常有幫助:) – Nick

+1

剛發現我實際上希望'LEFT OUTER JOIN'包含'table1'中所有'table2'中沒有對應記錄的記錄。很高興在50K大關提醒你:) – Nick

+0

不客氣! –

2

在JW的回答之上,如果這是你想要做一個永久的事(即數據是非規格化的),您可以添加CASCADE DELETEtableB.name,其中引用tableA.name。這要求您使用支持外鍵(即InnoDB的)

+0

感謝「CASCADE DELETE」的領導。我會離開這個,直到我感到勇敢的一天:) – Nick

+0

@nick Np。原則上相當簡單,但是您需要確保始終要刪除兩條記錄。一個巨大的缺點(與觸發器解決方案一起)是,這在代碼方面是「隱藏的」。即您正在將業務邏輯推入數據庫。 – hafichuk

+0

是的,這就是我所理解的。我會暫時將它留在代碼中。讓我感覺更安全:) – Nick