Mysql中设置更新数据时,timestamp字段的值自动更新为当前时间

很多时候,在设计一张应用表时,都会带上更新时间的字段,以便表示当前行的数据是在什么时间被更新的。一般来说,在插入时,会赋当前系统时间为默认值,而在更新的时候,会顺带更新这个更新时间的字段。

但这依赖于程序员的自觉。我之间就遇到过好多应用系统的表中定义了更新时间字段,但实际在做更新操作时,并没有去更新这个字段的情况。

那有没有一种更好的方法,能够支持在对表进行UPDATE更新操作时,自动将更新时间的字段赋值为系统时间呢?

下面来做个实验。

先创建一张普通的用户表,其中包含一个更新时间的字段update_time,字段的默认值为current_timestamp。

create table user(
    id int,
    user_name varchar(50),
    age int,
    update_time timestamp default current_timestamp
);

然后向表中插入2种数据。在插入的时候,并不对update_time字段进行显式的赋值,而是使用系统默认值。

mysql> insert into user(id,user_name,age) values(1,'jack',32);
Query OK, 1 row affected (0.00 sec)
mysql> insert into user(id,user_name,age) values(2,'mac',33);
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+------+-----------+------+---------------------+
| id | user_name | age | update_time |
+------+-----------+------+---------------------+
| 1 | jack | 32 | 2018-12-20 22:08:45 |
| 2 | mac | 33 | 2018-12-20 22:08:45 |
+------+-----------+------+---------------------+
2 rows in set (0.01 sec)

可以看到,插入的两条记录的update_time字段,都使用了当前系统时间进行赋值。

假如现在发现用户id为1的用户,年龄写错了,应该是30岁,而不是32岁。这时就需要对表进行更新。

mysql> update user set age = 30 where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from user;
+------+-----------+------+---------------------+
| id | user_name | age | update_time |
+------+-----------+------+---------------------+
| 1 | jack | 30 | 2018-12-20 22:08:45 |
| 2 | mac | 33 | 2018-12-20 22:08:45 |
+------+-----------+------+---------------------+
2 rows in set (0.00 sec)

update语句执行完成后,可以发现,虽然age字段的值被更新过来了,但update_time字段的值并没有被同步更新,仍然是原来插入时的值。

其实,设置字段的on update属性,可以使对表中的记录更新时,对应记录的update_time字段的值会自动更新为当前系统时间。

mysql> drop table user;
Query OK, 0 rows affected (0.02 sec)
mysql> create table user(
-> id int,
-> user_name varchar(50),
-> age int,
-> update_time timestamp default current_timestamp on update current_timestamp
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into user(id,user_name,age) values(1,'jack',32);
Query OK, 1 row affected (0.00 sec)
mysql> insert into user(id,user_name,age) values(2,'mac',33);
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+------+-----------+------+---------------------+
| id | user_name | age | update_time |
+------+-----------+------+---------------------+
| 1 | jack | 32 | 2018-12-20 22:12:41 |
| 2 | mac | 33 | 2018-12-20 22:12:41 |
+------+-----------+------+---------------------+
2 rows in set (0.00 sec)

上面在创建表时,指定了update_time字段的属性on update current_timestamp。下面来执行UPDATE更新数据。

mysql> update user set age = 30 where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from user;
+------+-----------+------+---------------------+
| id | user_name | age | update_time |
+------+-----------+------+---------------------+
| 1 | jack | 30 | 2018-12-20 22:13:08 |
| 2 | mac | 33 | 2018-12-20 22:12:41 |
+------+-----------+------+---------------------+
2 rows in set (0.00 sec)

从上面结果来看,不仅age字段的值被更新正确了,而且update_time字段的值也被自动更新为了系统当前时间。

【版权说明:仅允许非商业转载且请注明出处:Mac私塾 网址:http://macsishu.com】

发表评论

邮箱地址不会被公开。