2015-07-14 2 views
0
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 изменил «измененный» столбец на обновление сам по себе

Почему MySQL это делает?

Как я могу остановить это поведение?

+0

Похоже, что часть времени изменена на время, когда запись была обновлена. – Cyclonecode

ответ

0

Это потому, что вы использовали тип данных timestamp для столбца 'changed', который обновляется каждый раз, когда строка обновляется.

Если вы хотите, чтобы это работало должным образом, я вместо этого изменил бы тип данных «измененных» на datetime.

+0

Спасибо, вот что я сделаю. – hogan

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 
); 
+0

Спасибо, метод datetime для моего дела более чист. – hogan

0

timestamp колонка автоматически обновляется:

С ни DEFAULT CURRENT_TIMESTAMP ни ON UPDATE CURRENT_TIMESTAMP, это то же самое, с указанием как DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP.

См. docs.

Смежные вопросы