我用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;
用户注册后,将使用Authenticated = 0
将用户插入到表users中。作为管理员,我必须使用以下方式对用户进行身份验证:
UPDATE users SET Authenticated = 1 WHERE ID = {$id};
我想知道的是如何创建触发器和存储过程,以在上述Authenticated_At
查询之后将UPDATE
列更新为当前日期和时间。
谢谢。
答案 0 :(得分:2)
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明智地指出的那样,最好的解决方案是将timestamp列定义为仅在UPDATE
操作中自动更新,例如:
`Authenticated_At` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP