2014-02-19 47 views
0

我有兩個包含相關鍵的表。我想選擇從tbl_one和tbl_two行中刪除具有相關鍵的行的最佳方法。我嘗試使用DELETE JOIN正確地執行此操作,但是我發現另一種非常簡單的方式,即使用兩條刪除語句。你能告訴我哪個更好嗎?Mysql - 使用連接刪除vs兩個刪除語句

DELETE FROM tbl_one WHERE id =1; 
DELETE FROM tbl_two WHERE tbl_one_id =1; 
+0

最佳選擇是使用級聯刪除定義引用完整性 –

回答

0

如果使用單個或多個語句來修改數據庫內容,您正在使用的交易沒關係,只要:

第一種方法:

DELETE tbl_one, 
tbl_two FROM tbl_one 
JOIN tbl_two ON tbl_one.id = tbl_two.tbl_one_id WHERE tbl_one.id = 1 

第二種方法。如果沒有交易可能會出現兩個問題:

  1. 另一個進程訪問數據其間你運行一個語句另一個查詢後,也就是「不乾淨」,因爲只有報表的組成部分已被處理數據庫的狀態。這可能總是發生在多個客戶端可以同時使用數據庫的系統中,例如在網頁等中。

  2. 後續查詢可能會失敗,無論出於何種原因。在這種情況下,只有部分報表已經處理完畢,另一部分未處理。這會使數據庫再次處於「未定義」狀態,在這種情況下是持久的情況。您必須通過錯誤檢測手動防止這種情況發生,但即使如此,也可能無法解決問題。

關係數據庫管理系統爲此提供transactions。事務允許從邏輯的角度將多個語句「捆綁」到單個語句。您開始交易,運行您的報表,然後關閉交易。如果出現意想不到的情況,您可以始終「回滾」您的交易,這樣您就可以像事務開始之前那樣獲得穩定而清晰的數據庫狀態。

1

操作的關注點應該是孤立的(既可以是兩者也可以不是) 您應該將操作放在事務塊中。 在我看來,第一個查詢更好用,因爲服務器可以通過單個查詢來達到保存點,而不是解析並執行兩個查詢。

關閉foreign_key_check全局變量並運行查詢,然後再打開它。

注意:你可以使用mysql提供的級聯外鍵行爲。