2011-11-27 80 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只是链接到我不知道的一些功能。如果你使用的是独特的密钥,这将适用于你。