Подтвердить что ты не робот

MySQL ON UPDATE CURRENT_TIMESTAMP не обновляется

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

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.

4b9b3361

Ответ 1

Вы пытались использовать 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);

Ответ 2

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

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

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

Ответ 3

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

Вы должны установить значение в запросе NOW() для установки текущего штампа времени.

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

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

Ответ 4

Чтобы указать автоматические свойства, используйте предложения 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 не работают, если включен режим SQL NO_ZERO_DATE, потому что этот режим вызывает "ноль" значения даты (указанные, например, как 0 0000-00-00 00:00:00) отвергнуто. Имейте в виду, что режим TRADITIONAL SQL включает NO_ZERO_DATE.

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

Ответ 5

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

  • Создать поле для хранения автоматически обновляемой метки времени (обычно я называю мой "измененным" ).
  • Укажите поле Введите "TIMESTAMP"
  • Укажите поле Значение по умолчанию как 'CURRENT_TIMESTAMP'
  • Укажите поле Extra как "ON UPDATE CURRENT_TIMESTAMP"

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