2011-08-24 60 views
1

我有一個基本上有三列的表:user_id,設置和值。我試圖使用以下代碼:MySQL:高級插入如果不存在

INSERT INTO 'user_settings'(user_id, setting, value) 
VALUES (1234, setting_1, 500) 
ON DUPLICATE KEY UPDATE user_id = 1234, setting = setting_1' 

這在創建新設置時效果很好,並且不會生成重複記錄。問題出現在我想更改值時 - 在上一個查詢運行後無效:

INSERT INTO 'user_settings'(user_id, setting, value) 
VALUES (1234, setting_1, 999) 
ON DUPLICATE KEY UPDATE user_id = 1234, setting = setting_1' 

沒有行受到影響。顯然我錯過了一些東西...

重要:我無法改變數據庫(新的主鍵或什麼)。

UPDATE:看來我對ON DUPLICATE KEY的理解是錯誤的。但問題依然存在 - 完成這一任務最有效的方法是什麼?

在下面的評論中回答:「如果主鍵(或唯一鍵)是(user_id,setting),則使用:... ON DUPLICATE KEY UPDATE value = 999」。

+0

什麼是主鍵? – Yahia

+3

我想說你不應該在UPDATE部分分配'user_id',因爲這已經是導致他插入錯誤的關鍵。 –

+0

主鍵未列出 - 表中有更多的列沒有真正相關。 –

回答

2

假設您實際上在user_id上有一個唯一的密鑰,您會得到「不受影響的行」,因爲您沒有更改第二個查詢中的任何內容。我想你想要做的就是更新value領域以及:

INSERT INTO 'user_settings'(user_id, setting, value) 
VALUES (1234, setting_1, 999) 
ON DUPLICATE KEY UPDATE setting = setting_1,value=999 

沒有在那裏value,你只需設置user_idsetting場他們以前相同的價值觀,和MySQL沒有按」 t需要更新記錄。

如果您在user_id上沒有唯一密鑰,則必須找到不同的方法,因爲ON DUPLICATE KEY UPDATE不會觸發。

+0

'user_id'上沒有唯一的鍵,所以看起來我使用'ON DUPLICATE KEY'錯誤。任何想法我應該使用什麼方法? –

+0

@Luke:什麼是PK?桌子上還有其他唯一鍵嗎? –

+1

如果主鍵(或唯一鍵)爲'(user_id,setting)',則使用:... ... ON DUPLICATE KEY UPDATE value = 999'。 –

相關問題