MySQL ON UPDATE CURRENT_TIMESTAMP не обновляется - PullRequest
28 голосов
/ 06 апреля 2011

У меня есть таблица, которая выглядит следующим образом:

CREATE TABLE IF NOT EXISTS `Hosts` (
`id` int(128) NOT NULL AUTO_INCREMENT,
`IP` varchar(15) NOT NULL DEFAULT '',
`Port` varchar(5) NOT NULL DEFAULT '',
`Password` varchar(32) NOT NULL DEFAULT '',
`Username` varchar(32) NOT NULL DEFAULT '',
`Tid` varchar(32) NOT NULL DEFAULT '',
`EquipType` varchar(64) NOT NULL DEFAULT '',
`Version` varchar(128) DEFAULT NULL,
`Status` varchar(10) NOT NULL DEFAULT '',
`Location` varchar(128) NOT NULL DEFAULT '',
`Lastconnection` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
`Lastbackup` date NOT NULL DEFAULT '0000-00-00',
`Backupstatus` varchar(64) NOT NULL DEFAULT '',
`Backupmsg` text,
`Backupfile` varchar(30) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `IP` (`IP`),
KEY `Tid` (`Tid`),
KEY `EquipType` (`EquipType`),
KEY `Status` (`Status`),
KEY `Lastbackup` (`Lastbackup`),
KEY `Backupstatus` (`Backupstatus`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=716 ;

На мой взгляд, это означает, что при каждом обновлении строки в поле «Lastconnection» должна указываться текущая временная метка.Однако, когда я запускаю что-то вроде:

update Hosts set Backupstatus = 'FAIL',  Backupmsg = 'Connection timed out' where Tid = 'SITE001'

Lastconnection остается «0000-00-00 00:00:00».Либо проблема с базой данных я не вижу, либо я полностью неправильно понимаю предложение ON UPDATE CURRENT_TIMESTAMP.

Ответы [ 5 ]

33 голосов
/ 03 августа 2011

Вы пытались использовать значение NULL для этого поля при обновлении?

Вы также можете попробовать установить значение по умолчанию CURRENT_TIMESTAMP вместо 0000-00-00 00:00:00.

Тем не менее, когда бы я ни захотелчтобы иметь время создания и обновления, я всегда использую следующее:

...
CREATED timestamp NOT NULL default '0000-00-00 00:00:00',
UPDATED timestamp NOT NULL default now() on update now(),
....

Я использую now(), потому что это псевдоним для CURRENT_TIMESTAMP и он короче.В конце структура таблицы получает CURRENT_TIMESTAMP, так что не волнуйтесь.

Уловка с полем CREATED заключается в том, чтобы не забывать использовать null в обоих полях для операторов INSERT, для операторов UPDATEне требуется:

INSERT INTO mytable (field1, field2, created, updated)
VALUES ('foo', 'bar', null, null);
14 голосов
/ 19 июня 2013

Возможно, оператор обновления ничего не меняет. Если строка с Tid = 'SITE001' уже имеет Backupstatus, установленную на 'FAIL', и Backupmsg, установленную на 'Connection timed out' (возможно, установленную какой-либо предыдущей попыткой резервного копирования), MySQL пропустит эту строку и, следовательно, не изменит Lastconnection отметка времени.

Кроме того, я вижу ON UPDATE CURRENT_TIMESTAMP больше как административную функцию для отслеживания изменений данных. Как программист, я бы добавил явное обновление метки времени:

update Hosts<br> set Backupstatus = 'FAIL', Backupmsg = 'Connection timed out', Lastconnection = NOW() where Tid = 'SITE001'.

7 голосов
/ 24 ноября 2015

Вы должны помнить, что если значение не было изменено при обновлении, оно не установит текущую метку времени,

Вы должны установить значение в запросе NOW(), чтобы установить текущую отметку времени !!!

update Hosts set Backupstatus = 'FAIL',Lastconnection = NOW() , Backupmsg = 'Connection timed out' where Tid = 'SITE001'

Помните, что значение должно измениться для изменения текущей отметки времени.

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

Чтобы указать автоматические свойства, используйте предложения DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP.Порядок пунктов не имеет значения.Если оба присутствуют в определении столбца, любой может произойти первым.Любой из синонимов для CURRENT_TIMESTAMP имеет то же значение, что и CURRENT_TIMESTAMP.Это CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP и LOCALTIMESTAMP().

Использование DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP относится только к TIMESTAMP.Предложение DEFAULT также можно использовать для указания постоянного (неавтоматического) значения по умолчанию;например, DEFAULT 0 или DEFAULT '2000-01-01 00:00:00'.

DEFAULT 0 не работают, если включен режим NO_ZERO_DATE SQL, поскольку этот режим приводит к «нулевым» значениям даты (указанным, например, как 0 ').0000-00-00 00:00:00 ') будет отклонено.Помните, что режим TRADITIONAL SQL включает NO_ZERO_DATE.

. Кроме того, вы можете инициализировать или обновить любой столбец TIMESTAMP до текущей даты и времени, присвоив ему значение NULL, если только оно не указано.был определен с атрибутом NULL, чтобы разрешить значения NULL.

0 голосов
/ 01 октября 2012

Если вы хотите, чтобы запись автоматически обновляла временную метку при каждом изменении записи, вот четыре простых шага, которые необходимо выполнить (это может быть все за один шаг, в зависимости от того, используете ли вы для администрирования командную строку или графический интерфейс):

  1. Создать поле для хранения автоматически обновляемой метки времени (я обычно называю мою «измененной»).
  2. Указать тип поля как «TIMESTAMP»
  3. Указать поле по умолчаниюas 'CURRENT_TIMESTAMP'
  4. Указать поле Extra как 'ON UPDATE CURRENT_TIMESTAMP'

Теперь поле, содержащее вашу метку времени, всегда будет обновляться до текущей метки времени при каждом обновлении записи.

...