我用PHP和MySQL创建了一个登录系统,我为用户提供了下表:
CREATE TABLE `users` (
`ID` int(11) NOT NULL,
`Authenticated` tinyint(1) NOT NULL DEFAULT 0,
`Name` varchar(20) NOT NULL,
`Surname` varchar(20) NOT NULL,
`Username` varchar(20) NOT NULL,
`Email` varchar(255) NOT NULL,
`Password` varchar(70) NOT NULL,
`Created_At` datetime DEFAULT current_timestamp(),
`Authenticated_At` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
当用户注册时,会在表users中插入一个具有Authenticated = 0
的用户。I、 作为管理员,必须使用对用户进行身份验证
UPDATE users SET Authenticated = 1 WHERE ID = {$id};
我想知道的是如何创建一个触发器和一个存储过程,在前面提到的UPDATE
查询之后将Authenticated_At
列更新为当前日期和时间。
提前谢谢。
1)最简单的解决方案:
UPDATE users SET Authenticated = 1, Authenticated_At = NOW() WHERE ID = {$id};
2) 另一种解决方案是为时间戳值设置DEFAULT
值。这是在表定义中实现的,比如:
CREATE TABLE `users` (
`ID` int(11) NOT NULL,
`Authenticated` tinyint(1) NOT NULL DEFAULT 0,
`Name` varchar(20) NOT NULL,
`Surname` varchar(20) NOT NULL,
`Username` varchar(20) NOT NULL,
`Email` varchar(255) NOT NULL,
`Password` varchar(70) NOT NULL,
`Created_At` datetime DEFAULT current_timestamp(),
`Authenticated_At` datetime DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
来自文件:
当行中任何其他列的值从其当前值更改时,自动更新的列将自动更新为当前时间戳。如果所有其他列都设置为当前值,则自动更新的列保持不变。若要防止自动更新的列在其他列更改时更新,请显式将其设置为当前值。要在其他列不变的情况下更新自动更新的列,请显式地将其设置为应具有的值(例如,将它设置为CURRENT_TIMESTAMP)。
为了在每次更新记录时自动更新Authenticated_At
时间戳(而不更新Created_At
),您需要:
UPDATE users SET Authenticated = 1, Created_At = Created_At WHERE ID = {$id};
3) 正如@Raymond Nijland明智地评论的那样,最好的解决方案是定义仅在UPDATE
操作中自动更新的时间戳列,如:
`Authenticated_At` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP