MySQL TIMESTAMP

摘要:在本教程中,您将了解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)
MySQL Timestamp example 1

第五,将会话的时区设置为不同的时区,看看我们将从数据库服务器获得什么值:

SET time_zone ='+03:00';Code language: SQL (Structured Query Language) (sql)

最后从表中查询数据:

SELECT t1 FROM test_timestamp;Code language: SQL (Structured Query Language) (sql)
MySQL Timestamp timezone changes

如您所见,我们收到了根据新时区调整的不同时间值。

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 TIMESTAMP - 自动初始化

从输出中可以看到,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)
MySQL TIMESTAMP - Automatic Updating

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)
MySQL TIMESTAMP - Automatic Updating feature

请注意, 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 TIMESTAMP - 自动更新功能

有关自动初始化和更新的更多信息,请查看MySQL网站上的时间初始化

从 MySQL 5.6.5 开始, DATETIME列还具有自动初始化和更新功能。此外, DEFAULT_CURRENT_TIMESTAMPON UPDATE CURRENT TIMESTAMP可以应用于多个列。

在本教程中,您了解了 MySQL TIMESTAMP数据类型以及如何使用TIMESTAMP列的自动初始化和更新功能。

本教程有帮助吗?