定义表时,字段在UPDATE CURRENT_TIMESTAMPATTR上具有UPDATE_AT timestamp。 但是现在我想更新一些列,而不是修改update_at。 如何忽略
对更新
的影响?
请注意为您的特定用例正确地测试这一点,但是我只是用我自己的测试了一下,下面的测试很好地满足了您所描述的需求。
ALTER TABLE `test`
ALTER `timestamp` DROP DEFAULT;
ALTER TABLE `test`
CHANGE COLUMN `timestamp` `timestamp` TIMESTAMP NULL AFTER `value`;
然后进行更新。。。
更改回用:
ALTER TABLE `test`
CHANGE COLUMN `timestamp` `timestamp` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER `value`;
这样可以保留早期的时间戳,而不会更改或丢失任何时间戳。
还有另一个选择-嗯,两个选择。 假设这是你的桌子。
create table test (id int, update_at timestamp on update current_timestamp);
insert into test values (1, current_timestamp), (2, current_timestamp);
select * from test;
+------+---------------------+
| id | update_at |
+------+---------------------+
| 1 | 2020-06-10 08:18:33 |
| 2 | 2020-06-10 08:18:33 |
+------+---------------------+
假设您要将ID 1更新为ID 4。
通常情况下,这种情况会发生。 DB将自动更新update_at,因为您没有为该字段提供任何数据。
update test set id = 4 where id = 1;
mysql> select * from test;
+------+---------------------+
| id | update_at |
+------+---------------------+
| 4 | 2020-06-10 08:21:11 |
| 2 | 2020-06-10 08:18:33 |
+------+---------------------+
那么,我们为什么不直接告诉DB使用相同的时间戳呢? 让我们这样做,并确保您的时间戳保持不变。
update test set id = 6, update_at = update_at where id = 2;
mysql> select * from test
-> ;
+------+---------------------+
| id | update_at |
+------+---------------------+
| 4 | 2020-06-10 08:21:11 |
| 6 | 2020-06-10 08:18:33 |
+------+---------------------+
请注意,ID 6(即ID 2)具有与前面相同的时间戳。
您将在临时变量中记住update_at,然后在执行更新时应用该临时变量。
select update_at into @temp_update_at from test where id = 6;
mysql> select @temp_update_at;
+---------------------+
| @temp_update_at |
+---------------------+
| 2020-06-10 08:18:33 |
+---------------------+
mysql> update test set id = 12, update_at = @temp_update_at where id = 6;
mysql> select * from test;
+------+---------------------+
| id | update_at |
+------+---------------------+
| 4 | 2020-06-10 08:21:11 |
| 12 | 2020-06-10 08:18:33 |
+------+---------------------+
您现在保留了时间戳。