提问者:小点点

mysql:当更新一些记录时,如何忽略“On update”?


定义表时,字段在UPDATE CURRENT_TIMESTAMPATTR上具有UPDATE_AT timestamp。 但是现在我想更新一些列,而不是修改update_at。 如何忽略对更新的影响?


共2个答案

匿名用户

请注意为您的特定用例正确地测试这一点,但是我只是用我自己的测试了一下,下面的测试很好地满足了您所描述的需求。

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。

  1. 您可以使用自身更新update_at字段
  2. 记住ID%1的update_at值,更新ID%4并用记住的数据替换update_at

通常情况下,这种情况会发生。 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 |
+------+---------------------+

您现在保留了时间戳。