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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在“for”循环中以 1 递增时,是不是有使用 > (<) 而不是 != 的技术原因?

最长连续递增子序列(部分有序)

最长递增子序列-golang 实现

以递增的顺序将列表拆分为多个列表

最长递增子序列

navicat自动递增的原理