MySQL 在更新时自行更改 'changed' 列

标签 mysql sql

create table test (id int, changed timestamp);

insert into test (id, changed) values (1, now());
insert into test (id, changed) values (2, now());
insert into test (id, changed) values (3, now());

select * from test;

+----+---------------------+
| id | changed             |
+----+---------------------+
| 1  | 2015-07-14 14:58:00 | <-- correct
| 2  | 2015-07-14 14:58:02 |
| 3  | 2015-07-14 14:58:04 |
+----+---------------------+


update test set id = 5 where id = 1;  -- nothing with 'changed' specified!

select * from test;

+----+---------------------+
| id | changed             |
+----+---------------------+
| 5  | 2015-07-14 15:00:00 | <-- wrong! why?
| 2  | 2015-07-14 14:58:02 |
| 3  | 2015-07-14 14:58:04 |
+----+---------------------+

看到列已更改,我想设置 id 但未更改。数据库第一次对我执行此操作。

MySQL 为什么要这样做?

我怎样才能阻止这种行为?

最佳答案

默认情况下,TIMESTAMP 列将设置为 CURRENT_TIMESTAMP,并且每当您更新行时也会使用该列。

当您使用以下方式创建表格时:

CREATE TABLE test (
  id int,
  changed TIMESTAMP
);

它将与此相同:

CREATE TABLE test (
  id int,
  changed TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

对于常量,默认值为给定值。在这种情况下,该列根本没有自动属性:

CREATE TABLE test (
  id int,
  changed TIMESTAMP 0
);

关于MySQL 在更新时自行更改 'changed' 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31418208/

相关文章:

mysql - SQL在某些情况下的特殊排序顺序

mysql - 为什么按主索引排序会使此查询变慢?

python - Django ORM 查询 - 如何从模型字段中减去时间?

mySQL - 根据第一行中的计数组合行结果?

mysql - 如何获取每组中的最大值和最小值以及它们的时间?

php - CodeIgniter 具有多种功能的交易

mysql - 将 Rails 模型属性映射到旧表中的字段

mysql - 需要获取最近 10 个活跃主题的用户

mysql - 更新另一个表等于某个值的位置

sql - ODBC SQL 连接应保持打开状态多长时间?