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

问题描述 投票:0回答:2

假设我有一个名为 Tokens 的表,其中包含以下列:idrefresh_tokentoken。 fresh_token 列应该是唯一的。但我们可能有很多刷新令牌字段为空。这些空的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 完成的。

mysql sql ruby mysql2
2个回答
0
投票

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

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

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

不确定您需要什么。希望以上任何一项对您有所帮助:)


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
的结果将返回受影响的行。

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

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

使用

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

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

你还没有说出如果该值已经存在你想要做什么。

© www.soinside.com 2019 - 2024. All rights reserved.