MySQL, phpMyAdmin: TIMESTAMP всегда выполняет функцию NOW - PullRequest
5 голосов
/ 05 июля 2011

Что-то очень раздражающее происходит с моими TIMESTAMPS ...

В моей Таблице есть столбцы "createat", "deleat" и "updatedat" ... Я установил свой удаленный и обновилat to NULL и DEFAULT NULL ... однако, когда добавляется новая запись, функция NOW () всегда выполняется для удаленных и обновляемых, а не просто остается равной NULL.

Так что в итоге я получаю:00:00:00 ...

Почему это просто значение по умолчанию NULL?

Вот мой стол: enter image description here

Вот при вставке (обратите внимание на СЕЙЧАСфункция выбрана): enter image description here

Выполнен следующий SQL:

INSERT INTO `MYTABLE_DEV`.`messages` (`id`, `fromUserId`, `toUserId`, `subject`, `body`, `createdat`, `updatedat`, `deletedat`) VALUES (NULL, '1', '3', 'Message', 'This is another message.', CURRENT_TIMESTAMP, NOW(), NOW());

Ответы [ 4 ]

1 голос
/ 28 июня 2012

Пусть это будет здесь (небольшой патч в 3.5.2, который полностью решает эту проблему): отчет об ошибке

1 голос
/ 05 июля 2011

Это ожидаемое поведение.

В отличие от других баз данных, в MySQL TIMESTAMP столбцы ВСЕГДА обновляются с now() при каждом обновлении строки.Это преднамеренная особенность типа данных TIMESTAMP.

Редактировать: Обратите внимание, что я говорю здесь о TIMESTAMP, , а не TIMESTAMP DEFAULT NULL или любых других вариантах.

Вам нужен DATETIME тип данных - они ведут себя как обычные столбцы.

Вот некоторый тестовый SQL, чтобы показать его поведение:

create table timestamp_datatype (id int, dt datetime, ts timestamp);
-- test 1: leaving ts to default - you get now()
insert into timestamp_datatype (id, dt) values (1, '2011-01-01 01:01:01'); 
-- test 2: trying to give ts a value - this works
insert into timestamp_datatype (id, dt, ts) values (2, '2011-01-01 01:01:01', '2011-01-01 01:01:01');
-- test 3: specifying null for ts - this doesn't work - you get now()
insert into timestamp_datatype (id, dt, ts) values (3, '2011-01-01 01:01:01', null);
-- test 4: updating the row - ts is updated too
insert into timestamp_datatype (id, dt, ts) values (4, '2011-01-01 01:01:01', '2011-01-01 01:01:01');
update timestamp_datatype set dt = now() where id = 4; -- ts is updated to now()
select * from timestamp_datatype;
+------+---------------------+---------------------+
| id   | dt                  | ts                  |
+------+---------------------+---------------------+
|    1 | 2011-01-01 01:01:01 | 2011-07-05 09:50:24 |
|    2 | 2011-01-01 01:01:01 | 2011-01-01 01:01:01 |
|    3 | 2011-01-01 01:01:01 | 2011-07-05 09:50:24 |
|    4 | 2011-07-05 09:50:24 | 2011-07-05 09:50:24 |
+------+---------------------+---------------------+
1 голос
/ 05 июля 2011

Вы выполняете NOW () вместо установки null.Используйте этот запрос:

INSERT INTO `MYTABLE_DEV`.`messages` (`id`, `fromUserId`, `toUserId`, `subject`, `body`) VALUES (NULL, '1', '3', 'Message', 'This is another message.');

или со всеми полями ...

INSERT INTO `MYTABLE_DEV`.`messages` (`id`, `fromUserId`, `toUserId`, `subject`, `body`, `createdat`, `updatedat`, `deletedat`) VALUES (NULL, '1', '3', 'Message', 'This is another message.', CURRENT_TIMESTAMP, NULL, NULL);
0 голосов
/ 05 июля 2011

Это может быть ошибка / функция в phpMyAdmin. Посмотрите на этот отчет об ошибке , и особенно на комментарий, добавленный в 2010-06-13 11:06:47 UTC. Интересная часть:

Вы можете задать вопрос, однако, значение по умолчанию NOW () в поле выбора при выполнении INSERT / UPDATE, когда значение по умолчанию поля timestamp установлен в NULL. Это может быть не то, что вы подозреваете при настройке по умолчанию NULL.

Если это правда, я думаю, именно так работает phpMyAdmin. Я сам не использую phpMyAdmin, поэтому у меня нет личного опыта.

...