MSSQL int 递增 1:递增 2 而不是 1 [关闭]
Posted
技术标签:
【中文标题】MSSQL int 递增 1:递增 2 而不是 1 [关闭]【英文标题】:MSSQL int increment by one: increments by 2 instead of by 1 [closed] 【发布时间】:2019-09-06 11:59:01 【问题描述】:我很疑惑,我的列值总是加2而不是1。
登录失败时,执行以下查询:
$sql_string = <<<SQL
IF (NOT EXISTS (SELECT * FROM failed_logins_user WHERE user_id = $user_id))
BEGIN
INSERT INTO failed_logins_user (user_id, attempts_count)
VALUES ($user_id, 1)
END
ELSE
BEGIN
UPDATE failed_logins_user
SET attempts_count = attempts_count + 1
WHERE user_id = $user_id
END
SQL;
预期:
第一次尝试失败时,将创建行,尝试次数 == 1 在第二次尝试失败时,更新该行,尝试次数 == 2实际:
第一次尝试失败时,将创建行,尝试次数 == 2 在第二次尝试失败时,更新行,尝试次数 == 4谁能看到我的错误在哪里?我是否弄错了 IF/ELSE? (user_id 是主键,顺便说一句)
(PS:我使用 $user_id 的参数绑定 - 我只是简化了这部分查询。)
【问题讨论】:
听起来像(a)您无意中运行了两次查询(我们需要查看其余的 php 代码才能弄清楚)或(b)您可能有一个触发器正在更新值。 请不仅发布查询,还发布相关的PHP代码。您几乎可以肯定调用此查询两次,要么是由于 PHP 中的错误,要么是因为您在登录失败时处理了两个请求(可能是失败,也可能是重定向)。 你说@jasie,但你得到的行为表明不是。无论如何提供代码,以便我们可以消除这个原因。 解决了!评论者是对的:如果我重新加载页面,计数正确地增加 1,如果我使用登录按钮,则执行两次查询。有人会相信我,我没有编写 PHP 代码(带有查询的 func 除外)吗? WTF...谢谢@Nick 和 Ed Cottrell @jasie 不幸的是,这个接近的原因有点误导。你的问题很切题。但是,您已经解决了问题,错误的原因在于代码中不属于您的帖子的一部分。在这些情况下,(1)你得到了帮助(耶!),(2)社区没有其他可以建设性的事情,(3)这个问题不太可能帮助其他人前进。我们将其搁置主要是为了让其他用户知道它不需要额外的答案。 【参考方案1】:我会推荐更多类似的东西。
首先,从failed_logins_user
上的唯一索引开始:
create unique index unq_failed_logins_user_user_id on failed_logins_user(user_id);
然后先尝试更新并检查是否有任何更新:
DECLARE @rc INT;
UPDATE failed_logins_user
SET attempts_count = attempts_count + 1
WHERE user_id = @user_id; -- pass this value in as a parameter!
SET @rc = @@ROWCOUNT;
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO failed_logins_user (user_id, attempts_count)
VALUES (@user_id, 1); -- pass this value in as a parameter!
END;
话虽如此,我会将每个失败的登录作为单独的行保留在 failed_logins_user
中。特别是,我想要失败的日期/时间,也许还有用户的设备/IP 地址。
【讨论】:
谢谢。我确实将日期时间作为表中的第三列,我只是从代码中省略了它以保持简单。但是您的建议很好-不要使用计数,而是将每次失败的登录尝试添加为行。但是可能会为每个用户添加多达 10 或 20 行而不是一行,所以它有点贪婪。我想知道:计数行是否比从尝试计数列中提取值更快? @jasie 。 . .即使使用正确的索引,计算行数显然也会更加耗时。关键是每次登录失败的详细信息可能都是相关的。以上是关于MSSQL int 递增 1:递增 2 而不是 1 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章