MSSQL int递增1:递增2而不是1

时间:2019-09-06 11:59:01

标签: php sql sql-server increment

我很困惑,我的列值总是增加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;

预期:

  • 第一次失败尝试时,将创建该行,并带有trys_count == 1
  • 在第二次尝试失败时,将更新该行,并带有trys_count == 2

实际:

  • 第一次失败尝试时,将创建该行,并带有trys_count == 2
  • 第二次尝试失败时,将更新该行,并添加trys_count == 4


有人可以看到我的错误在哪里吗?我是否弄错了IF / ELSE?
user_id是主键,btw

(PS:我对$ user_id使用参数绑定-我只是简化了查询的这一部分。)

1 个答案:

答案 0 :(得分: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地址。