很多时候,在设计一张应用表时,都会带上更新时间的字段,以便表示当前行的数据是在什么时间被更新的。一般来说,在插入时,会赋当前系统时间为默认值,而在更新的时候,会顺带更新这个更新时间的字段。
但这依赖于程序员的自觉。我之间就遇到过好多应用系统的表中定义了更新时间字段,但实际在做更新操作时,并没有去更新这个字段的情况。
那有没有一种更好的方法,能够支持在对表进行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字段的值也被自动更新为了系统当前时间。