2011-12-22 105 views
4

我有SQL(MySQL的5.x的)查詢,如:對重複密鑰更新 - 添加到現有的價值

  INSERT INTO table (val1), 
      ON DUPLICATE KEY UPDATE `val1` = VALUES(`val1`) 

這工作得很好。

現在我需要用VALUES(val1)+ ruby​​變量進行更新。

  INSERT INTO table (val1), 
      ON DUPLICATE KEY UPDATE `val1` = VALUES(`val1`) + #{ruby_variable} 

將引發錯誤。

(紅寶石這裏僅僅是一個例子,實際上我需要和值(val1)+整數)

如何才能做到?

+1

請更多背景。你在寫Ruby嗎?你使用類似續集的東西嗎? – three 2011-12-22 18:40:27

+0

向我們展示了更大的背景 – cristian 2011-12-22 18:41:01

+0

更新了更多細節。謝謝。 – 2011-12-22 18:45:12

回答

4

就在fine manual的頂部,你會看到的正是你試圖做那種事的例子:

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE c=c+1; 

所以你正在尋找這樣的:

connection.execute(%Q{ 
    INSERT INTO table (val1) VALUES(#{connection.quote(x)}) 
    ON DUPLICATE KEY UPDATE `val1` = `val1` + #{connection.quote(ruby_variable)} 
}) 

其中x是您要插入的內容,而ruby_variable是您想要在存在重複時添加到val1的內容。 INSERT需要VALUES,而不是ON DUPLICATE。

+0

不要忘記在第二部分中轉義'ruby_variable'。 – tadman 2011-12-22 19:44:48

+0

@tadman:謝謝,至少我在第一關中得到了其中一個。當然,如果AR降低了態度併爲每個其他健全的數據庫接口添加了「execute」的佔位符支持,那麼這將會很好,那麼我們就不必假裝我們在1999年編寫PHP時必須直接工作與SQL。但現在我開始咆哮。 – 2011-12-22 19:56:00

+1

我還沒有看到一個很好的解釋,爲什麼'sanitize_sql'是一個受保護的方法。我總是不得不通過使用'send'或編寫簡單的類方法來正確地轉義。另外我不知道你是否曾經在這裏看過帶有PHP標籤的東西,但如果問題和答案有任何跡象,它仍然是1999年。 – tadman 2011-12-24 03:34:31