2011-08-17 103 views
2

在一個查詢中從幾個表中刪除行的正確方法是什麼?在一個查詢中從多個表中刪除行

我問的原因是因爲我正在用PHP做這個。如果我使用多個查詢從每個表中刪除一個表,PHP必須多次訪問數據庫。如果我使用這種方法,會對性能產生影響嗎?

我知道ON DELETE CASCADE選項,但這不適用於每個存儲引擎。另外,當我刪除父記錄時,可能會出現不想從子表中刪除所有記錄的情況。

回答

2
DELETE 
    t1, t2 
FROM 
    table1 AS t1 INNER JOIN table2 AS t2 
ON 
    joinCondition 
WHERE 
    whereCondition 

像往常一樣用DELETE查詢:要非常小心

更多細節在這裏:http://dev.mysql.com/doc/refman/5.5/en/delete.html

+0

我聽說,在一次從多個表中刪除不理想。這是因爲語法不允許使用'LIMIT'? – recount88

+0

一般更容易犯了一個錯誤,將刪除比你預期的多。測試你的問題,你應該不會受到傷害。 – Mchl

+0

是否有速度,如果我使用了多個查詢刪除,而不是一個有什麼區別? – recount88

0

如果你不知道這個問題的答案,那麼你不應該試圖支持衆多的RDMS適合您的應用。直言不諱。像每個關係數據庫一樣,CASCADE選項可用。另外,您應該考慮如何存儲分層數據以刪除子記錄。

例如,如果你想刪除所有「文件」在「文件夾」使用嵌套集模型的時候,它僅僅是

DELETE from files where id > :lft and id < :rgt

問題,但在任何情況下,您仍然可以使用JOIN刪除從多個表中刪除。但是,不支持大量的RDMS,因此如果您擔心使用級聯,那麼即使使用DBAL,也無法在每個數據庫上使用連接刪除。

答案

  • 使用DBAL,如學說DBAL(不是ORM),並使用瀑布那裏支持。
  • 選擇一個數據庫,並使用你所知道的進行開發。
0

我也曾經遇到類似的問題。我的解決方案是寫我自己的最小recruive查詢。只有一個查詢,它爲你做了剩下的事情。這是怎麼一回事呢:

//主要功能

功能工廠($ DB){$表=陣列( '表1', '表2', '表3' ...); //我一直到表12
for($ i = 0; $ i <''sizeof($ table); $ i ++){
delete($ db,$ table [$ i]);
}}

//刪除功能..可能還有塞提特了withn工廠的功能,但4 undestanging緣故

刪除($分貝,$表){

$ SQL ='刪除'。$ table;如果($ db-> query($ sql)){echo ucfirst($ table)。'刪除完成100%';

}

}

這就是所有...使非預定義的插件組,克里特島varible保存從您的數據錄入頁面數組的大小,改變刪除到「工作插入表'準備聲明並執行。 希望它可以幫助你以某種方式