📅  最后修改于: 2023-12-03 15:33:03.111000             🧑  作者: Mango
在 MySQL 中,我们可以使用 UPDATE
语句来更新数据表中的数据。但是,如果我们想要在更新时自动更改时间戳,该怎么做呢?本文将介绍两种方法来实现这个目标。
BEFORE UPDATE
触发器首先,我们需要创建一个数据表来测试这个功能。以下是一个简单的 blog
数据表,其中包含 id
、title
、content
和 updated_at
四个字段。
CREATE TABLE `blog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` text NOT NULL,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
BEFORE UPDATE
触发器接下来,我们需要创建一个 BEFORE UPDATE
触发器,这个触发器将在数据表更新时自动更新 updated_at
字段的值。
CREATE TRIGGER `update_blog_updated_at` BEFORE UPDATE ON `blog` FOR EACH ROW
BEGIN
SET NEW.updated_at = NOW();
END;
触发器执行的逻辑很简单:在每次更新数据表中的一行时,它会将 updated_at
字段的值设置为当前时间戳。
现在,我们可以测试一下这个功能是否正常工作了。假设我们想要更新 id
为 1 的博客文章的内容:
UPDATE `blog` SET `content` = 'New content' WHERE `id` = 1;
执行完以上语句后,我们可以查询 blog
表,看一下 updated_at
字段的值是否被更新了:
SELECT `updated_at` FROM `blog` WHERE `id` = 1;
ON UPDATE
的属性除了使用触发器外,MySQL 还提供了一个更简单的方法来在更新时自动更改时间戳,那就是使用 ON UPDATE
的属性。
我们需要修改 blog
数据表,将 updated_at
字段的类型改为 timestamp
并添加 ON UPDATE CURRENT_TIMESTAMP
的属性:
ALTER TABLE `blog` MODIFY COLUMN `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
这个语句将会将 updated_at
字段的类型从 timestamp
修改为 timestamp
并添加了一个 ON UPDATE CURRENT_TIMESTAMP
的属性,表示 updated_at
字段将在每次更新数据表中的一行时自动设置为当前时间戳。
现在,我们可以测试一下这个功能是否正常工作了。假设我们想要更新 id
为 1 的博客文章的内容:
UPDATE `blog` SET `content` = 'New content' WHERE `id` = 1;
执行完以上语句后,我们可以查询 blog
表,看一下 updated_at
字段的值是否被更新了:
SELECT `updated_at` FROM `blog` WHERE `id` = 1;
使用以上两种方式,我们都可以在 MySQL 中实现在更新时自动更改时间戳的功能。具体选择哪一种方式取决于你的偏好和具体情况。触发器会增加一些代码的复杂度,但是它更加灵活,可以自定义触发条件。而属性方式则更加简单直接,但是它对表结构所需做的修改比较大,不一定适用于所有的情况。