MySQL插入和更新数据表时的时间字段设计

 黑渐神|he-jason.com   2019-03-05 14:52   63 人阅读  MySQL插入和更新数据表时的时间字段设计已关闭评论

MySQL的日期类型可以使用CURRENT_TIMESTAMP来指定默认值,但是这个跟MySQL的版本及日期的具体类型有关,只有5.6之后的版本才能使用CURRENT_TIMESTAMP作为DATETIME的默认值。
例如:

ALTER TABLE t_user ADD update_time DATETIME DEFAULT CURRENT_TIMESTAMP

在5.6之前的版本,使用CURRENT_TIMESTAMP作为默认值时,就会出现下面的错误

[Err] 1067 - Invalid default value for 'update_time'

在MySQL 5.6.5版本之前,DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP只适用于TIMESTAMP,而且一张表中,最多允许一个TIMESTAMP字段采用该特性。 从MySQL 5.6.5开始, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP同时适用于TIMESTAMP和DATETIME,且不限制数量。

我们通过创建一个数据表来尝试一下timestamp的好处

create table users(id int not null auto_increment,name varchar(24) not null,password varchar(16) not null,c_date timestamp default current_timestamp,u_date datetime default current_timestamp on update current_timestamp,comment varchar(255) not null,primary key(`id`))engine=innodb default charset=utf8 collate=utf8_bin;
mysql> insert into users(name,password,comment) values ("jason","123456","jason");
Query OK, 1 row affected (0.00 sec)

这里我们没有插入时间,看接下来的记录,应该会为我们添上

mysql> select * from users;
+----+-------+----------+---------------------+---------------------+---------+
| id | name  | password | c_date              | u_date              | comment |
+----+-------+----------+---------------------+---------------------+---------+
|  1 | jason | 123456   | 2019-03-05 14:21:13 | 2019-03-05 14:21:13 | jason   |
+----+-------+----------+---------------------+---------------------+---------+
1 row in set (0.00 sec)

这里的创建时间c_date和上一次更新时间u_date都添加上了。
接着我们用update 来更新记录,正常的话u_date也会刷新为当前系统时间

mysql> update users set password='00000abc' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from users;
+----+-------+----------+---------------------+---------------------+---------+
| id | name  | password | c_date              | u_date              | comment |
+----+-------+----------+---------------------+---------------------+---------+
|  1 | jason | 00000abc | 2019-03-05 14:21:13 | 2019-03-05 14:24:45 | jason   |
+----+-------+----------+---------------------+---------------------+---------+
1 row in set (0.00 sec)

到时,确实实现了我们想要的结果,原来用timestamp来设计表结构真的很省事
接下来强行解释一波timestamp

timestamp解析:

timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下:

1.CURRENT_TIMESTAMP

当要向数据库执行insert操作时,如果有个timestamp字段属性设为

CURRENT_TIMESTAMP,则无论这个字段有木有set值都插入当前系统时间

2.ON UPDATE CURRENT_TIMESTAMP

当执行update操作是,并且字段有ON UPDATE CURRENT_TIMESTAMP属性。则字段无论值有没有变化,他的值也会跟着更新为当前UPDATE操作时的时间。

TIMESTAMP的变体

1.TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

在创建新记录和修改现有记录的时候都对这个数据列刷新

2.TIMESTAMP DEFAULT CURRENT_TIMESTAMP

在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它

3.TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

在创建新记录的时候把这个字段设置为0,以后修改时刷新它

4.TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss’ ON UPDATE CURRENT_TIMESTAMP

在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它

本文地址:https://www.he-jason.com/dbskill/mysql/781.html
版权声明:本文为原创文章,版权归 黑渐神|he-jason.com 所有,欢迎分享本文,转载请保留出处!
NEXT:已经是最新一篇了
双11拉新分百万红包

评论已关闭!