MySQL在更新时自行更改“已更改”列

时间:2015-07-14 22:05:15

标签: 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会这样做?

如何停止这种行为?

3 个答案:

答案 0 :(得分:1)

默认情况下,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
);

答案 1 :(得分:0)

这是因为您对“已更改”列使用了timestamp数据类型,每次更新行时都会更新。

如果您希望按预期方式工作,我会将“已更改”数据类型更改为datetime

答案 2 :(得分:0)

timestamp列会自动更新:

  

既没有DEFAULT CURRENT_TIMESTAMP也没有ON UPDATE CURRENT_TIMESTAMP,它与指定DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP相同。

请参阅docs