摘要:在本教程中,您将了解MySQL TIMESTAMP数据类型和TIMESTAMP
列功能,例如自动初始化和更新。
MySQL TIMESTAMP
数据类型简介
MySQL TIMESTAMP
是一种时态数据类型,保存日期和时间的组合。 TIMESTAMP
的格式为YYYY-MM-DD HH:MM:SS
,固定为 19 个字符。
TIMESTAMP
值的范围为'1970-01-01 00:00:01' UTC
到'2038-01-19 03:14:07' UTC
。
当您将TIMESTAMP
值插入表中时,MySQL 会将其从连接的时区转换为 UTC 进行存储。
当您查询TIMESTAMP
值时,MySQL 会将 UTC 值转换回您连接的时区。请注意,对于其他时态数据类型(例如DATETIME
,不会发生此转换。
默认情况下,连接时区是MySQL服务器的时区。当您连接到 MySQL 服务器时,您可以使用不同的时区。
当您检索由不同时区的客户端插入的TIMESTAMP
值时,您将得到一个与数据库中存储的值不同的值。只要不更改时区,就可以获得与存储的相同的TIMESTAMP
值。
MySQL TIMESTAMP
时区示例
我们通过一个例子来看看MySQL是如何处理TIMESTAMP
值的。
首先,创建一个名为test_timestamp
的新表,其中包含TIMESTAMP
列: t1
;
CREATE TABLE test_timestamp (
t1 TIMESTAMP
);
Code language: SQL (Structured Query Language) (sql)
其次,使用SET time_zone
语句将会话的时区设置为“+00:00”UTC。
SET time_zone='+00:00';
Code language: SQL (Structured Query Language) (sql)
第三,将TIMESTAMP
值插入到test_timestamp
表中。
INSERT INTO test_timestamp(t1)
VALUES('2008-01-01 00:00:01');
Code language: SQL (Structured Query Language) (sql)
第四,从test_timestamp
表中选择TIMESTAMP
值。
SELECT t1 FROM test_timestamp;
Code language: SQL (Structured Query Language) (sql)

第五,将会话的时区设置为不同的时区,看看我们将从数据库服务器获得什么值:
SET time_zone ='+03:00';
Code language: SQL (Structured Query Language) (sql)
最后从表中查询数据:
SELECT t1 FROM test_timestamp;
Code language: SQL (Structured Query Language) (sql)

如您所见,我们收到了根据新时区调整的不同时间值。
TIMESTAMP
列的自动初始化和更新
考虑以下示例。
首先,创建一个名为categories
的表:
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Code language: SQL (Structured Query Language) (sql)
在categories
表中, created_at
列是一个TIMESTAMP
列,其默认值设置为CURRENT_TIMESTAMP
。
其次,将新行插入到categories
表中,而不指定created_at
列的值:
INSERT INTO categories(name)
VALUES ('A');
Code language: SQL (Structured Query Language) (sql)
SELECT * FROM categories;
Code language: SQL (Structured Query Language) (sql)

从输出中可以看到,MySQL 使用插入时的时间戳作为created_at
列的默认值。
因此,对于未指定列值的插入行, TIMESTAMP
列可以自动初始化为当前时间戳。此功能称为自动初始化。
第三,将名为updated_at
的新列添加到categories
表中。
ALTER TABLE categories
ADD COLUMN updated_at
TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Code language: SQL (Structured Query Language) (sql)
updated_at
列的默认值为CURRENT_TIMESTAMP
。
而且,我们在DEFAULT CURRENT_TIMESTAMP
子句之后有一个新子句ON UPDATE CURRENT_TIMESTAMP
。我们来看看它的效果。
第四,在categories
表中插入一个新行。
INSERT INTO categories(name)
VALUES('B');
Code language: SQL (Structured Query Language) (sql)
五、从categories
表中查询数据:
SELECT * FROM categories;
Code language: SQL (Structured Query Language) (sql)

created_at
列的默认值是插入行时的时间戳。
六、更新行id为2的列name
中的值:
UPDATE categories
SET name = 'B+'
WHERE id = 2;
Code language: SQL (Structured Query Language) (sql)
七、从categories
表中查询数据,检查更新情况:
SELECT *
FROM categories
WHERE id = 2;
Code language: SQL (Structured Query Language) (sql)

请注意, updated_at
列中的值更改为更新行时的时间戳。
当行中任何其他列中的值从其当前值更改时, TIMESTAMP
列自动更新为当前时间戳的能力称为自动更新。
updated_at
列称为自动更新列。
请注意,如果执行UPDATE
语句来更新name
列的相同值,则updated_at
列将不会更新。
UPDATE categories
SET name = 'B+'
WHERE id = 2;
Code language: SQL (Structured Query Language) (sql)
updated_at
中的值保持不变。

有关自动初始化和更新的更多信息,请查看MySQL网站上的时间初始化。
从 MySQL 5.6.5 开始, DATETIME
列还具有自动初始化和更新功能。此外, DEFAULT_CURRENT_TIMESTAMP
和ON UPDATE CURRENT TIMESTAMP
可以应用于多个列。
在本教程中,您了解了 MySQL TIMESTAMP
数据类型以及如何使用TIMESTAMP
列的自动初始化和更新功能。