2010-02-04 82 views
1

在我的虛構數據庫中,我有幾列數據。在設計腳本的PHP前端時,必要時允許用戶修改元組的所有屬性。用於優化UPDATE查詢的SQL子句?

如果最終用戶只結束了修改一個屬性,而不是所有的人,下面的語句:

UPDATE foo 
    SET name='bar' location='YYZ' drink='ale' 
where user='smithj'` 

將更新的元組「smithj」的所有三個屬性,即使兩個屬性是相同的。

有沒有辦法讓SQL(MySQL,如果有所作爲)自動過濾掉冗餘更新,類似於CREATE TABLE IF EXISTS中的IF EXISTS子句?

謝謝!

回答

0

您需要在代碼中執行此操作。在任何情況下,您提供的示例查詢SQL injection :)

使用參數化查詢,動態構建它們,並只添加您想要更新的項目。

+0

最絕的!爲了演示,示例代碼是好的,但沒錯,一定安全隱患存在。 – 2010-02-04 22:51:04

1

就個人而言,您最有可能在此時嘗試進行預先優化。更新三個值,使他們成爲他們需要的東西就會很好。

檢查以查看要更新的內容最有可能花費更多。

1

要回答的第一個問題是爲什麼?

我看到的唯一原因就是表現。但性能挑戰可能有兩個原因:

  • 在您的應用程序和數據庫之間移動數據。您可以通過僅包含實際需要更新的更新語句中的列來減少這一點。但是,當我們談論三欄時,這是很多工作,可能不值得。還要注意,這個創建的大量不同的sql語句可能會殺死一些數據庫內部緩存。我不知道MySQL是否是這樣,但它是用於oracle的。 (假設您使用綁定變量(您應該))

  • 並實際操縱數據庫中的數據。但是在那個階段,找到要更新的記錄(where子句)實際更新成本要高得多。我猜這就是爲什麼沒有任何功能的原因,原來的更新,當新舊值實際上是相同的

0

什麼陽光建議一起去,你必須參數化查詢。

一個選項可能是這樣的(在高級僞代碼中): 當用戶編輯一個項目時(讓我們說keyPress),您可以標記該單元格。 您可以從每個標記的單元格獲取值,並且只將它們的值傳遞給參數化查詢。

然而,這是令人悲傷的,除非你有很多行,它不應該對你的表現有很大的不同。