创建触发器和存储过程,以在验证用户身份时更新Datetime

时间:2019-01-08 14:32:53

标签: mysql stored-procedures

我用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列更新为当前日期和时间。

谢谢。

1 个答案:

答案 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;

来自the documentation

  

当该行中任何其他列的值从其当前值更改时,自动更新的列将自动更新为当前时间戳。如果将所有其他列设置为其当前值,则自动更新的列将保持不变。为防止自动更新的列在其他列更改时更新,请将其显式设置为当前值。要在其他列不变的情况下更新自动更新的列,请将其显式设置为应具有的值(例如,将其设置为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