У меня есть один запрос на обновление таблицы, и некоторые поля должны быть обновлены в соответствии с условиями, давайте представим себе такой случай:
У меня есть таблица с именем mytable , она имеет DATETIME
поле с именем установлено , это поле может иметь значение NULL и по умолчанию равно NULL, а иногда некоторые значения имеют значение «0000-00-00 00:00:00».
Когда я получаю данныеот любого датчика (пример: идентификатор датчика 12457) Я обновляю его значения следующим образом:
UPDATE mytable SET
temperature=35,
pressure=122,
installed=NOW(),
status=1
WHERE id=12457
, если я получаю новые данные от того же датчика, я снова сохраняю его значения, но таким образом избегаю изменения установленного значения:
UPDATE mytable SET
temperature=35,
pressure=122,
installed=IF(installed IS NULL,NOW(),installed),
status=1
WHERE id=12457
Работает как положено, если установлено нулевое значение, оно сохраняет текущее время, если нет, сохраняет предыдущую дату, но я получаю это предупреждение, когда дата '0000-00-00 00: 00: 00 ':
Предупреждение. Значение за пределами диапазона для столбца, «установленного» в строке 1
Как предложено D-Shih , я попытался использовать COALESCE в качествеследующее, но я получил то же предупреждение:
installed=COALESCE(installed,NOW())
Я думал, что это потому, что предыдущая дата,Итак, я попытался воспроизвести ошибку намеренно, выполнив следующее:
UPDATE mytable SET
installed=installed,
WHERE id=12457
Но я не получил никакого предупреждения.
Система работает правильно, но мне немного любопытно, Почему я получаюэто предупреждение с использованием только функции IF (или COALESCE)?
Ответ Мадхур Бхайя :
SHOW CREATE TABLE mytable
CREATE TABLE `mytable` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`temperature` INT(11) NOT NULL DEFAULT '0',
`pressure` INT(11) NOT NULL DEFAULT '0',
`installed` DATETIME NULL DEFAULT NULL,
`status` INT(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
)
Пример данных:
INSERT INTO `mytable` VALUES (12457, 35, 122, '2018-12-12 12:53:49', 1);
INSERT INTO `mytable` VALUES (12458, 40, 119, '0000-00-00 00:00:00', 1);
INSERT INTO `mytable` VALUES (12459, 34, 122, null, 1);
INSERT INTO `mytable` VALUES (12460, 36, 122, '2018-12-12 12:57:01', 1);
Версия MySQL: 5.7.23