MySQL TIMESTAMP
简介:在本教程中,您将了解MySQL TIMESTAMP和
TIMESTAMP
列功能,例如自动初始化和更新。
MySQL TIMESTAMP简介
MySQLTIMESTAMP
是一种时态数据类型,它包含日期和时间的组合。 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 IF NOT EXISTS test_timestamp ( t1 TIMESTAMP );其次,使用
SET time_zone
语句将时区设置为“+00:00”UTC 。
SET time_zone='+00:00';第三,
TIMESTAMP
在test_timestamp
表中插入一个值。
INSERT INTO test_timestamp VALUES('2008-01-01 00:00:01');第四,
TIMESTAMP
从test_timestamp
表中选择值。
SELECT t1 FROM test_timestamp;
+---------------------+ | t1 | +---------------------+ | 2008-01-01 00:00:01 | +---------------------+ 1 row in set (0.00 sec)第五,将会话的时区设置为不同的时区,以查看从数据库服务器返回的值:
SET time_zone ='+03:00'; SELECT t1 FROM test_timestamp;
+---------------------+ | t1 | +---------------------+ | 2008-01-01 03:00:01 | +---------------------+ 1 row in set (0.00 sec)如您所见,我们收到了根据新时区调整的不同时间值。
TIMESTAMP列的自动初始化和更新
让我们从一个例子开始吧。 以下语句创建一个表名为categories
:
CREATE TABLE categories ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );在
categories
表中,created_at
列是一个TIMESTAMP
默认值设置为CURRENT_TIMESTAMP
的列。
以下语句在categories
表中插入新记录而不指定created_at
列的值:
INSERT INTO categories(name) VALUES ('A');
SELECT * FROM categories;
+----+------+---------------------+ | id | name | created_at | +----+------+---------------------+ | 1 | A | 2019-08-16 10:20:12 | +----+------+---------------------+ 1 row in set (0.00 sec)如您所见,MySQL使用时间戳(在插入行时)来初始化
created_at
列。
因此, TIMESTAMP
列可以自动初始化为插入行的当前时间戳,这些行不指定值的列。此功能称为自动初始化。
我们将添加一个新的列updated_at
在categories
表中。
ALTER TABLE categories ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
updated_at
列的默认值是CURRENT_TIMESTAMP
。但是,有一个语句ON UPDATE CURRENT_TIMESTAMP
在DEFAULT CURRENT_TIMESTAMP
语句后面。我们很快就会发现它的意义。
向categories
表中插入新记录。
INSERT INTO categories(name) VALUES('B');
SELECT * FROM categories;
+----+------+---------------------+---------------------+ | id | name | created_at | updated_at | +----+------+---------------------+---------------------+ | 1 | A | 2019-08-16 10:20:12 | 2019-08-16 10:22:32 | | 2 | B | 2019-08-16 10:24:09 | 2019-08-16 10:24:09 | +----+------+---------------------+---------------------+ 2 rows in set (0.00 sec)
created_at
列的默认值是插入行时的时间戳。
现在,我们更新id为2的行列中的name
值,并从categories
表中查询数据。
UPDATE categories SET name = 'B+' WHERE id = 2;
SELECT * FROM categories WHERE id = 2;
+----+------+---------------------+---------------------+ | id | name | created_at | updated_at | +----+------+---------------------+---------------------+ | 2 | B+ | 2019-08-16 10:24:09 | 2019-08-16 10:24:53 | +----+------+---------------------+---------------------+ 1 row in set (0.00 sec)请注意,
updated_at
列中的值更改为更新行时的时间戳。
TIMESTAMP
当行中任何其他列中的值从当前值更改时,列自动更新为当前时间戳的能力称为自动更新。
updated_at
列称为自动更新列。
请注意,如果执行
UPDATE
语句以更新name
列的值与更新值相同,updated_at
列则不会更新。
UPDATE categories SET name = 'B+' WHERE id = 2;
updated_at
保持不变的价值。
mysql> SELECT * FROM categories WHERE id = 2; +----+------+---------------------+---------------------+ | id | name | created_at | updated_at | +----+------+---------------------+---------------------+ | 2 | B+ | 2019-08-16 10:24:09 | 2019-08-16 10:24:53 | +----+------+---------------------+---------------------+ 1 row in set (0.00 sec)有关自动初始化和更新的更多信息,请查看MySQL网站上的初始化时间。
从MySQL 5.6.5开始,这些DATETIME
列还具有自动初始化和更新功能。另外,DEFAULT_CURRENT_TIMESTAMP
和ON UPDATE CURRENT TIMESTAMP
可以应用于多个列。
TIMESTAMP
数据类型,并向您展示了如何使用自动初始化和更新TIMESTAMP
列工作的功能。