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会这样做?
如何停止这种行为?
答案 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。