更清楚地说:

thetable (id int, username varchar(30), password varchar(30), last_successful_login timestamp, last_unsuccessful_login timestamp, another_variable varchar(30))表具有以下行:(1,“ tgh”,“ pass”,0,0,“另一个”)

1)用户/密码对不正确,但用户名所在行

我希望select id from thetable where username="tgh" and password="wrongpass" and another_variable="another";last_unsuccessful_loginusername="tgh"更新所有行的another_variable="another"列(这是唯一的,不能有(“ tgh”,“ another”)对的两行。是(,“ another2”)。)到CURRENT_TIMESTAMP

因此,在不完全匹配的“选择”查询之后,示例行将为(1, "tgh", "pass", 0, CURRENT_TIMESTAMP, "another")

更清楚地说,根据选择的结果,我试图避免在表上仅使用username="tgh"another_variable="another"update thetable set last_unsuccessful_login=CURRENT_TIMESTAMP where username="tgh" and another_variable="another";进行额外的更新。

2)正确的用户/密码对

另外,如果所有三个username以及passwordanother_variable都匹配,那么这次我想将last_successful_login设置为CURRENT_TIMESTAMP

这将使示例行`((1,“ tgh”,“ pass”,CURRENT_TIMESTAMP,0,“ another”)

最有效的方法是什么?

最佳答案

对于您的问题的简短回答是“否”,SELECT语句不可能导致或触发更新。 (需要注意的是,SELECT语句可以调用可以执行UPDATE的FUNCTION(MySQL存储程序)。)

您无法绕过发出UPDATE语句;必须从某个位置发出UPDATE语句,而SELECT语句不能“触发”它。

可以有一个UPDATE语句对照password列中的当前值检查提供的密码,并设置last_successful_login和last_unsuccessful_login列,例如:

UPDATE thetable
   SET last_successful_login =
       IF(IFNULL(password,'')='wrongpass',CURRENT_TIMESTAMP,0)
     , last_unsuccessful_login =
       IF(IFNULL(password,'')='wrongpass',0,CURRENT_TIMESTAMP)
 WHERE username='tgh'
   AND another_variable='another'


因此,您可以先发出UPDATE语句。然后发出SELECT语句。

如果要最大程度地减少到数据库的“往返”次数,以增加复杂性为代价(使其他人更难弄清是怎么回事),可以将UPDATE语句放入存储的程序中。如果将其放入函数中,则可以设置返回值以指示登录是否成功。

SELECT udf_login('username','wrongpass','another')


因此,从您的应用程序看来,您正在执行登录检查,但是被调用的函数可以执行UPDATE。

CREATE FUNCTION `udf_login`
( as_username         VARCHAR(30)
, as_password         VARCHAR(30)
, as_another_variable VARCHAR(30)
) RETURNS INT
READS SQL DATA
BEGIN
   UPDATE `thetable`
      SET `last_successful_login` =
          IF(IFNULL(`password`,'')=IFNULL(as_password,''),CURRENT_TIMESTAMP,0)
        , `last_unsuccessful_login` =
          IF(IFNULL(`password`,'')=IFNULL(as_password,''),0,CURRENT_TIMESTAMP)
    WHERE `username` = as_username
      AND `another_variable` = as_another_variable;

   -- then perform whatever checks you need to (e.g)
   --     SELECT IFNULL(t.password,'')=IFNULL(as_password,'') AS password_match
   --       FROM `thetable` t
   --      WHERE t.username = as_username
   --        AND t.another_variable = as_another_variable
   -- and conditionally return a 0 or 1
   RETURN 0;
END$$

关于mysql - 如果选择部分匹配该行的某一列,则触发该列的更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11960643/

10-11 13:22