2012-09-30 93 views
1

我已經搜索了很長一段時間,但我沒有找到我的問題的答案。首先讓我解釋我的問題來自哪裏。MySQL更新如果存在,插入如果不存在,刪除如果不存在(周計劃配置文件)

我有一個網絡應用程序,它有一個用戶表單,用戶可以在其中指定他/她可用的星期幾以及這幾天的辦公時間。想象一下,這是一個帶有複選框的網絡表單,適用於每個複選框/天的即時和隨時下載。現在,如果用戶配置文件插入到數據庫表我有我的表是這樣的:

idUser | idDay | fromTime | toTime 

    1 |  0 | 08:00 | 09:00 

(在這個例子中0代表週一(0 =月 - 6 = SU))

中當然有更改用戶配置文件的功能。所以有可能首先從早上5點到下午3點用戶可以使用mo-fr。現在配置文件被更改,以便用戶只能從早上5點到下午3點使用mo,fr,直到下午1點才使用,並且從上午9點到下午5點使用sa。在這種情況下,我必須更新現有條目,刪除已刪除的條目(在這個例子中是tue)並插入新的可用天數。

現在我首先刪除用戶的所有條目,然後我執行一個新的插入。這很容易,在這種情況下可能是最好的選擇(因爲每個用戶最多可以有7個條目)。但同樣的問題可能會出現在不同的情況下,可能會更好地優化查詢。

所以最後我的問題是:是否有可能執行更新如果存在,插入如果不是,並刪除所有其他條目中只有一個查詢?

我希望我的問題是可以理解的。

回答

0

最簡單的事情就是刪除所有實例,然後爲更新的條目創建一個新的時間表。這聽起來像你正試圖做一些過早的優化恕我直言,這將不是必要的。如果您發現刪除所有現有條目並將其替換爲性能瓶頸,那麼您可能需要考慮使用試圖最小化額外插入的方法,但我認爲這可能最終會比僅僅更簡單的方法刪除一切,並更換它

+0

嗨,我認爲和你一樣。但是如果你不知道有多少行將被刪除/插入,JvdBerg是正確的。因此,如果可能的條目數量嚴格限制爲少數(本例中爲7),我傾向於使用我目前使用的解決方案和您建議的解決方案。謝謝。 – Worn

0

在1個查詢中,您不能執行INSERTUPDATEDELETE

你有一些選擇:

  • MySql的:編寫處理您的問題一個存儲過程,並調用存儲過程來執行任務。來自PHP的1個電話會完成工作。
  • PHP:編寫一些代碼來執行任務並將其包含在事務中。

如果你問什麼是完成工作的最佳方法,你可能會開始一場戰爭。我把我的錢放在PHP解決方案上。

+0

嗨,感謝您的快速響應!你是否同意我的觀點,如果數據庫中只有很少的條目,可以刪除全部條目並插入新的條目集合嗎? – Worn

+0

不,我不會。首先,你永遠不知道會有多少條目。其次,你應該像現實一樣做事,而不要走捷徑,因爲這很容易編程。 – JvdBerg

+0

嗨,但在例子中,我知道每個用戶永遠不會有更多的7個條目(因爲每週有7天:-))。所以也許在這種情況下,捷徑是好的...否則你是完全正確的! – Worn

相關問題