更清楚地说:
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_login
和username="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
以及password
和another_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/