假设我有一个名为代币的表格,其中包含以下列: 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完成的。
答案 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
不确定你需要什么。希望以上任何一个可以帮助你:)