2011-11-27 133 views
1

在過去的幾天裏,我一直在爲這個問題困惑不解,但我不確定這是否可能,但是我想問一下。在SQL中更新或插入高分

如果您的分數較高,可以使用單個SQL語句更新高分,或者如果您的第一個分數是否可以插入?

我的成績表中有一個用戶名,級別和分數列,我喜歡它遵循以下邏輯:

  • 如果你的新的分數比你的最後得分這個水平時,則更換它。
  • 如果此級別沒有分數,請添加它。
  • 如果此級別的分數低於此級別的最高分數,則不執行任何操作。

這是可能在一個單一的SQL語句或我必須使用兩個,一個來看看你是否有新的高分,如果是這樣,取而代之?每個用戶標識在每個級別的表格中只有一個分數。

我正在使用MySQL。

UPDATE:

基於下面的答案,這下面的SQL工作:

INSERT INTO Scores SET UserID = 'user', Level = 'level', Score = 'score' 
    ON DUPLICATE KEY UPDATE Score = IF (Score < 'score', 'score', Score) 

我的表是這樣定義的用戶名和等級是兩個鍵。

+0

MERGE是Oracle的方式.. – Randy

+0

我沒有任何人了,但大多是試圖使用REPLACE與WHERE子句,但似乎並沒有在語法上是可行的。 –

回答

1

你將要使用:INSERT ... ON DUPLICATE KEY UPDATE語法此

site顯示使用的IF語句,而不是WHERE來完成你只更新得分較高,如果。

INSERT INTO Scores 
SET UserID = 'user' 
    , Level = 'level' 
    , Score = 'score' 
ON DUPLICATE KEY UPDATE 
    Score = IF (Score < 'score', 'score', Score) 
+0

我想過,但只有在只有一個唯一的索引/主鍵時才能正常工作。由於行需要按用戶ID和級別鍵入,所以我不確定它是否可以工作。 –

+0

@BrianGlaz桌子的鑰匙是什麼? –

+0

我不是OP = p。該文檔說,如果表有兩個唯一/主索引,則使用OR插入重複鍵更新查詢。這會導致問題,因爲它可能會更新不同的用戶分數,或者更正用戶的錯誤級別。 –

0

您需要兩條語句,對不起。有些人會建議REPLACE INTO,但這不會解決您的問題,因爲REPLACE INTO將在刪除該行之前再次添加它(如果存在)。因此,您將失去原始分數。您將無法使用REPLACE INTO增加分數。

編輯:也就是說,如果你還沒有在內存中的分數。但我不建議通過將數據選擇到應用程序內存中進行遞增操作,將其遞增,然後更新表格,因爲您可能無意中以這種方式導致競爭條件。

編輯#2:其實the guy above me只是鏈接到我不知道的一些功能。如果你使用的是獨特的密鑰,這將適用於你。