2015-12-27 82 views
-1

比方說,我有動態數字與他們唯一的ID。PHP MySQL插入/更新多個值

我想將它們插入到數據庫中。但是如果我已經有了這個特定的ID(UNIQUE),我需要添加到已經存在的值。

我已經嘗試使用「開啓關鍵更新」,但它並沒有真正解決問題。選擇舊數據,以便我們可以添加並更新它,效率不高。

是否有任何查詢可以做到這一點?

+0

可能重複[PHP MYSQL更新如果存在或插入,如果不是?](http://stackoverflow.com/questions/6853190/php-mysql-update-if-exist-or-insert-if-not) –

+0

*「我已經嘗試過使用」ON KEY UPDATE「,但它並沒有真正解決問題」* - 以什麼方式? 「在重複密鑰更新」是這裏工作的正確工具 - 就像''INSERT INTO Foo SET bar =:bar複製密鑰更新bar = bar +:bar「'應該做訣竅 - 但」這不是真的有效「不是我們可以調試的錯誤描述。 –

回答

0

在您的應用程序中增加您的價值並不能保證您的數據庫中始終有準確的結果,因爲存在併發問題。例如,如果兩個Web請求需要使用相同的ID增加數字,具體取決於計算機何時切換CPU上的進程,您可能會請求相互覆蓋。

而是做一些類似的更新:

UPDATE `table` SET `number` = `number` + 1 WHERE `ID` = YOUR_ID 

檢查從語句返回值。更新應返回受影響的行數,因此如果值爲1,則可以高興地發現自己儘可能高效。另一方面,如果您的返回值爲0,那麼您將不得不運行後續的插入語句來添加新的ID /值。

這也是確保併發性的最安全的方法。

希望這會有所幫助,祝你好運!

+0

這不回答這個問題。 OP指定可能不存在要更新的現有行。 –

+0

我恭敬地不同意。 OP首先知道ID的唯一方法是在數據庫中選擇它,或者嘗試運行更新並計算返回的行。在select-first解決方案中,他總是必須執行兩個查詢,在後一個解決方案中,如果更新返回1,那麼他不必運行第二個查詢,如果它返回0,那麼他知道該行不存在,並且他可以添加它。這是最高效的。 – ohiodoug

+1

對不起,我錯過了答案中的詳細信息,但仍然沒有:執行更新,檢查更新的行數,然後可能做一個插入操作並不是一個正確的解決方案。它受到與第一段中描述的大致相同的競爭條件,除非您手動包裝更新並插入事務中。正確的方法是使用'ON DUPLICATE KEY UPDATE';例如,一個查詢,如'INSERT INTO \'table \'SET \'number \'= 1,'''\'''''確保您只需要一個查詢。 –

-1

做了些什麼不同。我沒有更新舊值,而是插入新數據並留下舊數據,但使用某些唯一標識符,因此不會有重複項。現在爲了顯示這些數據,我使用了一個帶有sum屬性的簡單select查詢,然後用id對它進行分組。很好的工作,只是不知道這是否是最有效的方式。

+0

大家都錯過了我說過的觀點,我有動態的數字。我無法通過循環來格式化MySQL以接受它們。唯一的選擇是我寫的。而你所有的答案都是基本的東西,已經存在於每個角落。 –