假设我有一个名为 Tokens 的表,其中包含以下列:id、refresh_token 和 token。 fresh_token 列应该是唯一的。但我们可能有很多刷新令牌字段为空。这些空的refresh_token字段应该稍后更新,但是我们有可能尝试输入包含在另一个字段中的refresh_token值,这将导致冲突。
所以,我想做的是:
我就是这样做的,但我不确定这是否是最好的方法。也许你可以对你的答案提出建议并给出一些解释。
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 完成的。
更新前您可以使用以下语句进行检查。
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
不确定您需要什么。希望以上任何一项对您有所帮助:)
您可以像这样执行更新:
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”值而不是插入新记录仍然很奇怪。
你还没有说出如果该值已经存在你想要做什么。