【发布时间】:2017-06-13 19:55:25
【问题描述】:
我正在对我的一张表使用时间戳列,并使用自动更新功能。这是我的表架构:
mysql> desc user_rides;
+------------+--------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+-------------------+-----------------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | NO | MUL | NULL |
| ride_cnt | int(11) | YES | | NULL | |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | |
| updated_at | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+------------+--------------+------+-----+-------------------+-----------------------------+
5 rows in set (0.02 sec)
我期待的是,
created_at列与时间一起初始化,行被创建和updated_at列与created_at相同,并且在任何列(基本上是ride_cnt)更新时也会更新。
这很好用。
但我也期望updated_at 会更新,即使ride_cnt 具有相同的值。这样我就可以跟踪上次获取该行的值的时间,并且可以忽略以进一步运行。
例如:
ride_cnt = 0 的行将使用我们运行更新的最近时间进行更新。这样可以在很长一段时间内忽略行以重新初始化。
有什么方法可以在不手动传递时间戳的情况下实现这一点?
编辑:
这里发生了什么,
mysql> insert into user_ride set user_id=7445, user_ride=0;
Query OK, 1 row affected (0.01 sec)
mysql> insert into user_ride set user_id=7009, user_ride=2;
Query OK, 1 row affected (0.00 sec)
mysql> select * from user_ride;
+----+---------+-----------+---------------------+---------------------+
| id | user_id | user_ride | created_at | updated_at |
+----+---------+-----------+---------------------+---------------------+
| 1 | 7445 | 0 | 2017-06-13 10:44:05 | 2017-06-13 10:44:05 |
| 2 | 7009 | 2 | 2017-06-13 10:44:18 | 2017-06-13 10:44:18 |
+----+---------+-----------+---------------------+---------------------+
2 rows in set (0.00 sec)
mysql> update user_ride set user_ride=0 where id=1;
Query OK, 0 rows affected (0.01 sec)
Rows matched: 1 Changed: 0 Warnings: 0
mysql> select * from user_ride;
+----+---------+-----------+---------------------+---------------------+
| id | user_id | user_ride | created_at | updated_at |
+----+---------+-----------+---------------------+---------------------+
| 1 | 7445 | 0 | 2017-06-13 10:44:05 | 2017-06-13 10:44:05 |
| 2 | 7009 | 2 | 2017-06-13 10:44:18 | 2017-06-13 10:44:18 |
+----+---------+-----------+---------------------+---------------------+
2 rows in set (0.00 sec)
mysql> update user_ride set user_ride=1 where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from user_ride;
+----+---------+-----------+---------------------+---------------------+
| id | user_id | user_ride | created_at | updated_at |
+----+---------+-----------+---------------------+---------------------+
| 1 | 7445 | 1 | 2017-06-13 10:44:05 | 2017-06-13 10:45:26 |
| 2 | 7009 | 2 | 2017-06-13 10:44:18 | 2017-06-13 10:44:18 |
+----+---------+-----------+---------------------+---------------------+
2 rows in set (0.00 sec)
【问题讨论】:
-
你试过触发器吗?
-
如果您使用记录中已有的相同值进行更新,更新仍会发生,并且您当前的时间戳仍应更新。我在这里错过了什么吗?
-
@TimBiegeleisen,即使我假设相同,但事实并非如此。添加示例。
-
@Namphibian,由于其他复杂性,不想添加触发器。
-
@avisheks 我放弃了我上面的评论。如果数据不需要更改,MySQL 会不更新一行。
标签: mysql timestamp sql-timestamp