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.
Ответы
Ответ 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"
Теперь поле, содержащее вашу метку времени, всегда будет обновляться до текущей метки времени в любое время, когда запись будет обновлена.