2011-01-31 112 views
4

我正在開發一個web應用程序項目,並且有一個相當大的html表單,需要將其數據存儲在一個表中。表單和插入已完成,但我的客戶希望能夠將保存的數據加載回HTML表單,並且能夠更改它,再次,這沒有問題,但是當我要更新時遇到了一個問題,只要保持插入查詢,然後刪除舊行,如果它是一個編輯?MySQL UPDATE vs INSERT和DELETE

基本上,已經發生的情況是,當提交表單時,所有數據都使用INSERT放入表中,如果數據用於更新現有字段,我還有一個名爲edit的標誌,其中包含主鍵ID 。我可以通過兩種方式處理更新函數:

a)創建包含所有字段/數據集的實際更新查詢,並使用if/else來決定是運行更新還是插入查詢。

b)每次插入,但插入成功後,添加一行到DELETE WHERE row = editID。

由於刪除只會發生在INSERT成功的情況下,我不會冒着在沒有插入的情況下刪除數據從而丟失數據的風險,但由於INSERT/DELETE是兩個查詢,效率會不會比只是使用if/else來決定是否運行插入或更新?

有一個使用自動遞增id作爲外鍵的第二個表,但這個表有每個表單提交的時間進行更新,所以如果我刪除表A行,我也將被刪除表b中的關聯行。這似乎是不好的編程習慣,所以我傾向於選擇a),但是使用單線選項是非常誘人的。 DELETE基本上如下。這實際上是不好的編程習慣嗎?除了約定之外,有沒有什麼理由爲什麼這是一個「從來不這樣做!」代碼類型?

if ($insertFormResults) { 
     $formId = mysql_insert_id(); 
     echo "Your form was saved successfully."; 
     if(isset($_POST['edit'])){ 
      $query = "DELETE FROM registerForm WHERE id='$_POST[edit]'"; 
      $result = mysql_query($query); 
     } 
    } 
+1

[MySQL的LAST_INSERT_ID](http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html)會爲您提供自動增量值,然後您可以在UPDATE語句。刪除將無需運行自動增加值,除對參照完整性造成影響外。 – 2011-01-31 19:04:14

回答

3

雖然INSERT/DELETE選項將很好地工作,我建議反對爲:

  • 除非您將INSERT/DELETE 整合到一個單獨的事務中,或者更好地封裝了INSERT/DELETE到存儲的 過程中,您將運行理論上存在重複累積的 風險。如果 您使用SP或交易你 只是有效地重寫UPDATE語句 這顯然是低效 ,而且會給 引起一些WTF揚眉 後來有人維護你的代碼 。
  • 雖然它聽起來不像 問題在您的情況下,您是 潛在影響參考 完整性,如果您需要。 此外,你失去了 相當有用的能力,以容易 檢索創建順序的記錄。
  • 也許不是一個偉大的考慮上 一個小應用程序,但你 要以認真 零碎的數據庫很快 這將減慢數據檢索結束。
+0

這是我大學的新生入學指導的數據庫,每年至少有1000個新入學條目,具體取決於入學班級的大小。我沒有考慮到這種分裂,那肯定會導致問題的發生。 – awestover89 2011-01-31 19:32:40

0

更新只是一次往返服務器,這是更高效。除非您有一個涉及錯誤數據可能性的原因,否則始終默認使用UPDATE。

0

在我看來,做刪除是毫無意義的,如果你在MySql中運行更新,它只會更新記錄,如果它不同於已存儲的記錄,是否有某些原因需要刪除代替。我通常使用的情況下(開關)來捕捉更新/從用戶刪除通話,

<?php 
switch (action) { 

case "delete" : 
block of coding; 
if the condition equals value1; 
break; 

case "edit" : 
block of coding; 
if the condition equals value2; 
break; 

} 
?> 
相關問題