在更新mysql中已存在记录的列之前,请检查是否存在值

时间:2015-02-18 13:19:24

标签: mysql sql ruby mysql2

假设我有一个名为代币的表格,其中包含以下列: id refresh_token 令牌。 refresh_token列应该是唯一的。但是我们可能有许多空的refresh_token字段。这些null refresh_token字段应该稍后更新,但我们可能会尝试输入另一个字段中包含的refresh_token值,这将导致冲突。

所以,我想要做的是:首先检查refresh_token值是否包含在任何其他字段中。如果它不包含或者唯一,则可以使用该新的refresh_token值来更新具有给定id的特定行。 如果该值不是唯一的,那么我们可以做其他事情。

我就是这样做的,但我不确定这是不是最好的方法。也许你可以就你的答案提出建议和解释。

if con.query("(SELECT id FROM Tokens WHERE refresh_token='#{refresh_token}') LIMIT 1;").count == 1
          # do something important here
        else
          con.query("UPDATE Tokens SET refresh_token='#{refresh_token}' WHERE id='#{id}';")
        end

这是使用ruby完成的。

2 个答案:

答案 0 :(得分:0)

您可以执行以下更新:

UPDATE Tokens
SET refresh_token = 'C08Rbs'
WHERE id = '2'
AND NOT EXISTS (SELECT refresh_token FROM Tokens WHERE refresh_token = 'C08Rbs')

使用ROW_COUNT()确定是否实际更新了任何行。假设id = 2的行实际存在,如果没有更新行,它将返回0(因为该值已经存在)。

MySQL API中也提供了ROW_COUNT()函数(作为mysql_affected_rows()),因此您选择的编程语言将具有返回相同内容的函数,通常是{{UPDATE的结果。 1}}将返回受影响的行数。

通常,您使用唯一索引来避免特定列或列上的重复,并只是尝试更新:

UPDATE IGNORE Tokens
SET refresh_token = 'C08Rbs'
WHERE id = 2

使用IGNORE可以防止重复值出现错误,更新将不会发生,并且仍会返回实际更新的行数。它会在成功时返回1,在失败时返回0。

您更改“NULL”值而不是插入新记录仍然很奇怪。

如果值已经存在,您还没有说出要做什么。

答案 1 :(得分:-1)

您可以使用以下语句在更新前执行检查。

IF (NOT EXISTS(SELECT * FROM Tokens WHERE Token = ''))  
    BEGIN 
        INSERT INTO Tokens(token,..,..) 
        VALUES(val1,val2,val3) 
    END 
    END

OR

  IF (EXISTS(SELECT * FROM Tokens WHERE Token = ''))  
        BEGIN 
            update Tokens
           SET token = myVal
        END 
        END

不确定你需要什么。希望以上任何一个可以帮助你:)